Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Не підтверджено.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3.08 Mб
Скачать

Int mainO

{

derivedB ObjB; // Створення об'єкта класу // Створення і руйнування об'єкта ObjB. getchO; return 0;

Внаслідок виконання ця програма відображає на екрані такі результати: Створення baseC lass-об'єкта.

Створення derivedA-об'єкга.

Створення derivedB-об'єкга.

Руйнування derivedB-об'єкта.

Руйнування derivedA-об'єкта.

Руйнування baseClass-об'єкта.

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

Код програми 5.11. Демонстрація послідовності виконання конструкторів і

деструкторів під час успадкування декількох базових класів

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

class baseA { // Оголошення базового класу public:

baseAO {cout«"Створення baseA-об'єкта"« endl;}

-baseAO {cout«"Руйнування baseA-об'єкта" « endl;}

};

class baseB { // Оголошення базового класу public:

baseBO {cout «"Створення baseB-об'єкта" « endl;}

-baseBO {cout «"Руйнування baseB-об'єкта" « endl;}

};

// Оголошення похідного класу

class derived: public baseA, public baseB {

public:

derived() {cout «"Створення derived-об'єкта" « endl;}

-derivedO {cout «"Руйнування derived-об'єкта" « endl;}

};

Int mainO

{

derived ObjD; // Створення об'єкта класу // Створення і руйнування об'єкта ObjD. getchO; return 0;

}

Внаслідок виконання ця програма відображає на екрані такі результати: Створення baseA-об'єкта.

Створення baseB-об'єкта.

Створення derived-об'єкга.

Руйнування derived-об'єкта.

Руйнування baseB-об'єкта.

Руйнування baseA-об'єкта.

Як бачите, конструктори викликаються у порядку походження їх класів, зліва направо, у порядку їх задавання у переліку успадкування для класу derived. Дес­труктори викликаються у зворотному порядку, справа наліво. Це означає, що якби клас baseB знаходився перед класом baseA у переліку класу derived, тобто відповід­но до такої настанови:

class derived: public baseB, public baseA {, то результати виконання попереднього коду програми були б такими:

Створення baseB-об'єкта.

Створення baseA-об'єкта.

Створення derived-об'єкта.

Руйнування derived-об'єкта.

Руйнування baseA-об'єкта.

Руйнування baseB-об'єкта.

  1. Передача параметрів конструкторам базового класу

Дотепер жоден з попередніх прикладів не містив конструкторів, для яких по­трібно було б передавати аргументи. У випадках, коли конструктор тільки похід­ного класу вимагає передачі одного або декількох аргументів, достатньо викорис­товувати стандартний синтаксис параметризованого конструктора. Але як переда­ти аргументи конструктору базового класу? У цьому випадку необхідно викорис­товувати розширену форму оголошення конструктора похідного класу, у якому передбачено можливість передачі аргументів одному або декільком конструкто­рам базового класу.

Загальний формат розширеного оголошення конструктора похідного класу має такий вигляд:

конструктор_похідного_класу(перелік_аргументів):

ЬазеА(перелік_аргументів),

ЬазеВ(перелік_аргументів),

baseN{nepenk_ap3yMenmie);

{

тіло конструктора похідного класу

}

Тут елементи baseA, ..., baseN означають імена базових класів, що успадкову­ються похідним класом. Зверніть увагу на те, що оголошення конструктора похід­ного класу відділяється від переліку базових класів двокрапкою, а імена базових класів розділяються між собою комами (у разі успадкування декількох базових класів). Для розуміння сказаного розглянемо таку навчальну програму.

Код програми 5.12. Демонстрація механізму передачі параметрів конструкто­рам базового класу

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

class baseClass { // Оголошення базового класу protected: int с; public:

baseClass(int х) {с = х; cout«"Створення baseClass-об'єкта" « endl;}

-baseClassO {cout «"Руйнування baseClass-об'єкта" « endl;}

};

// Оголошення похідного класу class derived: public baseClass { int d; public:

// Клас derived використовує параметр x, а параметр у // передається конструктору класу baseClass. derived(int х, int у): baseClass(y)

{d = x; cout«"Створення derived-об'єкта"« endl;}

-derivedO {cout«"Руйнування derived-об'єкта" « endl;} void showB(char *s)

{cout « s «"c="« c «"; d=" « d « endl;}

};