68953

Конструктори похідних класів

Лекция

Информатика, кибернетика и программирование

У звязку із наслідуванням виникають два питання, що стосуються конструкторів і деструкцій. По-перше, коли викликаються конструктори і деструкції базового і похідного класів? По-друге, як передаються параметри конструкторів базового класу? Відповіді на ці питання містяться в наступному розділі.

Украинкский

2014-09-28

44 KB

0 чел.

Лекція № 15

Тема: Конструктори похідних класів

План

  1.  Виклик конструкторів похідних класів
  2.  Виклик конструкторів ієрархічних класів
  3.  Виклик конструкторів при множинному наслідуванні

Виклик конструкторів похідних класів

У зв'язку із наслідуванням виникають два питання, що стосуються конструкторів і деструкцій. По-перше, коли викликаються конструктори і деструкції базового і похідного класів? По-друге, як передаються параметри конструкторів базового класу? Відповіді на ці питання містяться в наступному розділі.

Коли викликаються конструктори і деструкції

Базовий і похідний клас можуть містити декілька конструкторів і деструкція. Отже, дуже важливо правильно розуміти, в якому порядку вони викликаються при створенні і знищенні об'єктів похідного класу. Спершу розглянемо наступний приклад.

#include <iostream>

using namespace std;

class base {

public:

based { cout « "Створюється об'єкт класу base\n"; }

~base() { cout << "Знищується об'єкт класу base\n"; }

};

class derived: public base {

public:

derived() { cout « "Створюється об'єкт класу derived\n"; }

~derived() { cout << "Знищується об'єкт класу derived\n"; }.j

};

int main() {

derived ob;

// Окрім створення і знищення об'єкту, нічого не відбувається

return 0;

}

Як вказано в коментарі до функції main (), програма просто створює, а потім знищує об'єкт ob класу derived. В ході виконання програма виводить на екран наступні повідомлення.

Створення об'єкту класу base

Створення об'єкту класу derived 

Знищення об'єкту класу derived 

Знищення об'єкту класу base

Як видимий, спочатку викликається конструктор базового класу, а потім — похідного. Після цього, оскільки об'єкт ob негайно знищується, викликається деструкція класу derived, а за ним — деструкція класу base.

Результати цього експерименту можна узагальнити. При створенні об'єкту похідного класу спочатку викликається конструктор базового класу, а потім – похідного. При знищенні об'єкту похідного класу спочатку викликається деструкція похідного класу, а потім — базового. Інакше кажучи, конструктори викликаються в ієрархічному порядку, а деструкції — в зворотному.

Це цілком природно. Оскільки базовий клас не має ніякої інформації про похідні класи, ініціалізація його об'єктів повинна виконуватися до ініціалізації будь-якого об'єкту похідного класу. Отже, конструктор базового класу повинен викликатися першим.

Цілком очевидно, що деструкції повинні викликатися в зворотному порядку. Оскільки похідний клас успадковує властивості базового, знищення об'єкту базового класу викличе знищення об'єкту похідного класу. Отже, деструкція похідного класу повинна викликатися до повного знищення об'єкту.

Виклик конструкторів ієрархічних класів

При ієрархічному спадкоємстві (коли похідний клас стає базовим для свого спадкоємця) застосовується наступне правило: конструктори викликаються в ієрархічному порядку, а деструкції — в зворотному. Розглянемо приклад.

#include <iostream>

using namespace std;

class base {

public:

base() { cout « "Створення об'єкту класу base\n"; }

~base() { cout « "Знищення об'єкту класу base\n"; }

};

class derivedl : public base {

public:

derivedl() { cout « "Створення об'єкту класу derivedl\n"; }

~derivedl() { cout « "Знищення об'єкту класу derivedl\n"; }

};

class derived2: public derivedl {

public:

derived2() { cout « "Створення об'єкту класу derived2\n"; }

~derived2() { cout « "Знищення об'єкту класу derived2\n"; }

};

int main()

{

derived2 ob;

// Створюємо і знищуємо об'єкт ob

return 0;

}

В результаті на екран виводяться наступні рядки.

Створення об'єкту класу base

Створення об'єкту класу derivedl

Створення об'єкту класу derived2

Знищення об'єкту класу derived2

Знищення об'єкту класу derivedl 

Знищення об'єкту класу base

Виклик конструкторів при множинному наслідуванні

Це правило застосовно і до множинного спадкоємства. Розглянемо наступну програму.

#include <iostream>

using namespace std;

class basel {

public:

basel() { cout << "Створення об'єкту класу basel\n"; }

~basel() { cout << "Знищення об'єкту класу basel\n"; }

};

class base2 {

public:

base2() { cout << " Створення об'єкту класу base2\n"; }

~base2() { cout << " Створення об'єкту класу base2\n"; }

};

class derived: public basel, public base2 {

public:

derived0 { cout « " Створення об'єкту класу derived\n"; }

~derived() { cout « " Знищення об'єкту класу derivedXn"; }

};

int main()

{

derived ob;

// Створення і знищення об'єкту ob

return 0;

}

Ця програма видає на екран наступні повідомлення.

Створення об'єкту класу basel 

Створення об'єкту класу base2

Створення об'єкту класу derived 

Знищення об'єкту класу derived 

Знищення об'єкту класу base2 

Знищення об'єкту класу basel

 

Як видимий, і в цьому випадку конструктори викликаються в ієрархічному порядку, зліва направо, як вказано в списку спадкоємства класу derived. Деструкції викликаються в зворотному порядку, справа наліво. Допустимо, що ім'я base2 вказане в списку спадкоємства класу derived перед ім'ям base1.

class derived: public base2, public basel {

Тоді результати роботи програми виглядали б так.

Створення об'єкту класу base2 

Створення об'єкту класу basel 

Створення об'єкту класу derived 

Знищення об'єкту класу derived 

Знищення об'єкту класу basel 

Знищення об'єкту класу base2


 

А также другие работы, которые могут Вас заинтересовать

50155. Исследование диффузии газов 268 KB
  Колбы 1 и 2 соединены трубкой которая может перекрываться краном 6. Через краны 7 и 8 колбы подсоединены к заправочной магистрали. Краны 7 и 8 служат для подключения к магистрали соответствующей колбы. Нормальное положение крана 21 ОТКРЫТ .
50156. Хронический эпитимпанит. Характер нарушения слуха (по данным камертонального и аудиометрического исследований) 14.98 KB
  Хронический эпитимпанит - форма хронического гнойного отита, которая характеризуется воспалением антрума и аттика – надбарабанного пространства.
50157. ИЗУЧЕНИЕ СФЕРИЧЕСКИХ ЛИНЗ 169 KB
  Обеспечивающие средства: осветительная лампа оптическая скамья собирающая и рассеивающая линзы разделитель экран. Для тонких линз верна формула : 1 где d и f расстояния от предмета и его изображения до оптического центра линзы; n =nлинзы nсреды отношение абсолютного показателя преломления вещества линзы к показателю преломления окружающей среды в которой находится линза nвоздУха ≈1; R1; и R2 радиусы кривизны поверхностей ограничивающих линзу. Оптическим центром линзы называется точка проходя через которую лучи не изменяют...
50158. Командна тактика нападу: швидкий напад, поступове розгортання нападу. Основні принципи організації нападу 28.5 KB
  Основні вимоги: обов’язкове своєчасне виконання довгих передач уперед з метою “відрізати†суперників; перша передача повинна як правило направлятися “диспетчеру†котрий оцінює обстановку і швидко направляє м’яч на лінію атаки; у завершальній фазі атаки використовувати награні комбінації з найкоротшим виходом нападників до воріт; гравці середньої лінії зобов’язані швидко створювати другий ешелон атаки. Основні вимоги: застосування точних передач і активне маневрування по всій ширині поля; постійна готовність до несподіваної...
50160. Отчеты и обработка (1С) 23.5 KB
  Свойства отчета редактируются в палитре свойств Свойства отчета. Фактически объект метаданных типа Отчет или Обработка представляет собой форму модуль которой является алгоритмом построения отчета а таблица служит для выдачи результатов построения отчетов в требуемом виде. Внешним отчетом в системе называется отчет или обработка хранящийся вне конфигурации в отдельном файле внешнего отчета. Отличием внешнего отчета от объектов метаданных типа Отчет и Обработка является то что он представляет собой только форму.
50161. Инновации в антикризисном управлении 25.93 KB
  Любая социально-экономическая система достигает успеха в своей деятельности, если она находится в состоянии последовательного и неуклонного развития. Если руководство не нацелена на освоение новых технологий, позволяющих производить новые виды продукции более высокого качества и с наименьшими затратами...
50162. Зміна ширини кроків і швидкості руху. Команди та дії 49.5 KB
  Стройові вправи. Загальнорозвивальні вправи. Загальнi методичнi рекомендацiï до складення комплексiв загальнорозвивальних вправ: завдання змiст пiдбiр вправ послiдовнiсть вправ у комплексi; чергування спрямованностi вправ тощо. Варiанти послiдовностi вправ у комплексi.
50163. Нечеткая логика 67.5 KB
  Блондинка -– рыжая - брюнетка unit Unit1; interfce uses Windows Messges SysUtils Vrints Clsses Grphics Controls Forms Dilogs ComCtrls StdCtrlsmth TeEngine Series ExtCtrls TeeProcs Chrt; type TForm1 = clssTForm Chrt1: TChrt; Series1: TLineSeries; Series2: TLineSeries; Series3: TLineSeries; Series4: TBrSeries; TrckBr1: TTrckBr; Lbel1: TLbel; Lbel5: TLbel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Lbel6: TLbel; Lbel2: TLbel; Lbel3:...