
- •45. Вызовы конструкторов в процессе работы программы.
- •48. Деструкторы.
- •49. Поля данных. Нестатические и статические поля – особенности их создания и инициализации. Правила обращения к полям. Константные поля.
- •50. Методы. Основные правила работы с методами. Константные методы. Статические методы.
- •51. Указатель this.
- •52. Дружественные функции и классы.
- •53. Перегрузка операций – общие положения.
- •54. Перегрузка операции присваивания. Особенности работы с ресурсоемкими объектами.
- •55. Перегрузка унарных операций.
- •56. Перегрузка бинарных операций.
- •57. Особенности определения классов с ключами struct и union.
- •58. Включение классов.
- •59. Наследование классов – общие положения.
- •Класс а
- •61. Общие особенности механизма простого наследования классов.
- •62. Множественное наследование.
- •63. Перечень специальных методов класса. Особенности определения конструкторов и деструкторов в производных классах.
- •64. Особенности определения и применения функций-операций «присваивание» в производных классах.
- •65. Особенности перегрузки операций в производных классах.
- •66. Общая характеристика виртуальных функций.
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о тем, что деструктор базового класса должен вызываться в деструкторе производного класса, а закрытый метод в базовом классе в производном классе будет не доступен.
Деструктор данной иерархии классов вызывается в порядке обратном по отношению к порядку вызова в конструкторе. При уничтожении объекта класс С сначала срабатывает деструктор С, затем В и в конце А.
При множественном наследовании деструктор базового класса вызывается в обратном порядке по отношению у порядку базового класса в списке спецификаторов в определении производного класса.