Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++.docx
Скачиваний:
27
Добавлен:
10.06.2015
Размер:
95.05 Кб
Скачать

63. Перечень специальных методов класса. Особенности определения конструкторов и деструкторов в производных классах.

При создании объекта производного класса из его конструктора явно или неявно вызывается конструктор базового класса, причем конструктор базового класса используется до использования тела производного класса.

В конструкторе ellipse базовый конструктор point вызывается явно, при этом параметры необходимого конструктора базового класса берутся из списка параметров конструктора производного класса.

ellipse double x1 = 0, y1 = 0, double vx1 =0, double vy1 = 0, double ax1 = 0, double ay1 = 0;

double rgor = 1, double rwert1 = 1):

point (x1, y1, vx1, vy1, ax1, ay1), rgor (rgor 1), rvert (rvert1)

Конструктор производного класса не имеет права инвертировать унаследованный от базового класса, так как в базовом классе может быть несколько конструкторов, и какой конструктор базового класса будет вызван в списке инициализации производного класса определяется контекстом, то есть с правилами вызова перегруженный функций, если в списке инициализации конструктор производного класса конструктор базового класса явно не вызывается, то неявно будет вызван конструктор умолчания. Здесь необходимо вспомнить, что конструктор умолчания либо явно определяется программистом, либо неявно создается компилятором, НО!!! Такое неявное создание происходит если в классе явно не создан никакой конструктор, таки образом создастся ситуация когда в производном классе нет конструктора умолчания, тогда производный класс попытается вызвать несуществующий конструктор и произойдет аварийная остановка.

Приведем схему последовательного вызова конструктора иерархии производного класса, для иерархии из 3-х уровней:

- С – производный класс

- В – прямой базовый класс для С и производный для А

- А – прямой базовый класс для В и косвенный для С

А

В

С

Рис. 4.6

Предположим, что в рамках этой иерархии каждый класс не только наследуется, но и создает свои поля. Причем среди своих имеются поля-объекты других классов. Пусть создан объект класса С, тогда:

  • выделится объем памяти для объекта класса С

  • вызовется конструктор класса С и внутри него вызовется конструктор В, внутри которого вызовется конструктор класса А

  • при выполнении конструктора класса А сначала вызовется конструктор класса X, Y и т.д., если в классе есть поля-объекты, после чего выполняется список инициализации конструктора класса А, а далее тело этого конструктора

  • далее конструктор типа В, причем здесь так же вначале вызывается конструктор класса X, Y и т.д., если в В есть поля-объекты этих классов, после этого выполняется инициализация конструктора класса В и далее тело этого конструктора. Далее аналогично выполняется конструктор класса С.

При множественном наследовании конструктор базового класса вызывается в порядке перечисления в описании их спецификаций производного класса.

Особым является случай ресурсоемких классов, в этом случае программист должен сам позаботится о корректном наследовании.

Деструкторы производного класса.

Деструктор базового класса должен быть либо открытым (это предпочтительно), либо защищенным, но не закрытым, это требование обусловлен6о тем, что деструктор базового класса должен вызываться в деструкторе производного класса, а закрытый метод в базовом классе в производном классе будет не доступен.

Деструктор данной иерархии классов вызывается в порядке обратном по отношению к порядку вызова в конструкторе. При уничтожении объекта класс С сначала срабатывает деструктор С, затем В и в конце А.

При множественном наследовании деструктор базового класса вызывается в обратном порядке по отношению у порядку базового класса в списке спецификаторов в определении производного класса.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]