Конструкторы и деструкторы в производных классах



Пример 6

Как мы объяснили в предыдущем разделе, создание объекта производного класса начинает цепочку вызовов конструкторов, в которой конструктор производного класса, перед выполнением своих собственных задач, вызывает конструктор своего непосредственного базового класса — либо явным образом (через инициализатор базового класса), либо неявно (вызывая конструктор по умолчанию базового класса). Аналогично, когда базовый класс сам является производным от другого класса, он должен вызвать конструктор следующего класса вверх по иерархии и т.д. Последний конструктор в этой цепочке вызовов является конструктором класса, лежащего в основании иерархии, чье тело фактически заканчивает выполнение первым. Тело конструктора первоначального производного класса заканчивает свое выполнение последним. Конструктор каждого базового класса инициализирует элементы базового класса, наследуемые производным классом. Рассмотрим, например, иерархию CommissionEmployee / BasePlusCommissionEmployee Примера 5. Когда программа создает объект BasePlusCommissionEmployee, вызывается конструктор СотmissionEmployee. Так как CommissionEmployee является основой иерархии, его конструктор исполняется, инициализируя закрытые элементы данных CommissionEmployee, которые являются частью объекта 

BasePlusCommissionEmployee. Когда конструктор CommissionEmployee завершает выполнение, он возвращает управление конструктору BasePlusCommissionEmployee, который инициализирует элемент baseSalary объекта BasePlusCommissionEmployee.

Когда объект производного класса уничтожается, программа вызывает его деструктор. Это начинает цепочку вызовов деструкторов, в которой деструктор производного класса, деструкторы прямых и косвенных базовых классов и деструкторы элементов классов исполняются в последовательности, обратной последовательности исполнения конструкторов. Когда вызывается деструктор производного класса, он выполняет свою задачу, затем вызывает деструктор следующего базового класса вверх по иерархии. Этот процесс продолжается, пока не будет вызван деструктор конечного базового класса на вершине иерархии. После этого объект удаляется из памяти.

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

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

Наш следующий пример пересматривает иерархию служащих-комиссионеров, определяя класс CommissionEmployee и класс ВаsePlusCommissionEmployee, которые содержат конструкторы и деструкторы, печатающие сообщения при их активации. Как вы увидите в выводе программы, эти сообщения демонстрируют порядок вызова конструкторов и деструкторов для объектов в иерархии наследования.

В этом примере мы модифицировали конструктор CommissionEmployee

и включили в класс CommissionEmployee деструктор ; оба они при вызове выводят строчку текста. Мы модифицировали также конструктор BasePlusCommissionEmployee  и включили в класс деструктор. При вызове они выводят строчку текста.


Дата добавления: 2018-08-06; просмотров: 188; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!