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


 

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

54444. Мово моя рідна, не мовчи! 522.5 KB
  А вчителька мовила що якби ваші словасуржики перетворились і справді на страшні дерева та ще на страшніших звірів я б побачила які ви герої Іванко. Багато віків люди засмічували рідну мову то модним словечком яке нічого спільного з рідною мовою не мало то вживали надмірно російські слова на український лад бо свого ліньки було підшукати а рідним словом нехтували цуралися його. Це не просто деревця це ті слова які ви щоденно говорите. А ви щодня сієте словазернятка і не задумуєтеся на тим що з того виросте.
54445. О рідна мовонько, о мово! В тобі від Бога кожне слово 115.5 KB
  Вчити учнів застосовувати набуті знання на практиці; Розвивати командний дух швидкість реакції прагнення перемоги вміння працювати в команді толерантне ставлення до думок інших Виховувати любов до рідної мови гордість за свою Батьківщину прагнення до самовдосконалення ХІД ЗАХОДУ Слово учителя Моя прекрасна українська мово Найкраща пісня в...
54446. Мова, наша мова ― пісня стоголоса! 1.51 MB
  Приспів: Калинова соловїна Вишиванками рясна Наша рідна Україна Розцвіте немов весна У нас на всіх одна надія Одна і радість і біда Ми землю мудрістю засієм Розквітне мова золота. Ви самі побачите яка чудова наша українська мова Багато тисяч літ тому жила в Україні прекрасна дівчина. А називалася ця красуня УКРАЇНСЬКА МОВА.
54447. Розквітай же, рідна українська мово! 183 KB
  А мова українська мов причастя Теплом своїм торкається грудей. ВЕДУЧА Мова це той інструмент який єднає націю народ в єдине ціле. ВЕДУЧИЙ Найбільше і найдорожче добро в кожного народу це його мова ота багата скарбниця в яку народ складає і своє давнє життя і свої сподіванки розум досвід почування писав Панас Мирний. Кожна мова неповторна.
54448. Гра-подорож у царство рідної мови 156 KB
  Українська мова Вчитель. Ця мова наче пташка свiтанкова IЦо гордо лине в свiй стрiмкий політ. Велична щедра і прекрасна мова Прозора й чиста як гірська вода. Це Українська мова барвінкова Така багата й вiчно молода.
54449. Journée Européenne des langues 494.5 KB
  Sensibiliser le public à limportance de lapprentissage des langues et de la diversification des diverses langues apprises afin de favoriser le plurilinguisme et la compréhension interculturelle; Promouvoir la riche diversité culturelle et linguistique de l'Europe, qui doit être maintenue et cultivée;
54450. Лунай, прекрасна наша мово! 582 KB
  Тип уроку: урок-свято Обладнання: вислови про мову фонограми пісень рушники верба речі з українського побуту тин штучна зелень квіти українські костюми збірки віршів українських письменників словники. На дошці та партах вислови про мову рушники квіти. Сьогодні ми зібрались щоб сказати теплі та ніжні слова про нашу рідну українську мову торкнутися сторінок її минулого сучасного...
54451. Виховання пошани й любові до рідної мови 73.5 KB
  Мирний У процесі вивчення української мови учнями початкових класів найважливіше місце посідає процес формування пошани й любові до рідного слова. Глибоке вивчення української мови можливе тільки тодіколи учень усвідомлює її як найдорожчий скарб в якому втілені національна самосвідомість характер історія народу. Так що сам педагог не повинен бути байдужий до мови або запобігливо уникати українського слова у вільному спілкуванні.
54452. Настроювання часових параметрів аудіо- та відеоряду. Додавання до відеокліпу відеоефектів та настроювання переходів між його фрагментами 190.5 KB
  Мета уроку: Навчальна: сформувати теоретичні знання про основні поняття мультимедійних даних принципи настроювання у часі відеокліпів. Тип уроку: комбінований Обладнання: Прилади відеокамера цифрова фотоапарат цифровий програмне забезпечення навчальні диски мультимедійний проектор мультимедійні навушники динаміки мікрофон електронні засоби: флешка. Таблиці Інтерфейс програми Movie Mker†Область монтажу†До уроку виготовлено: тематичні папки тема план урокупро що учні повинні дізнатися опорні конспекти;...