Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вариант_№32.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
364 Кб
Скачать
☆

Производные классы с конструкторами и деструкторами

Каждый класс — базовый и производный может иметь конструктор и де­структор. В каком порядке выполняются эти функции при простом и множе­ственном наследовании? Рассмотрим этот вопрос на модельных примерах.

Простое наследование.

Пример 36.

Программа иллюстрирует порядок работы конструктора и деструктора по схеме Base <- Derive1 <- Derive2. Она не делает ничего, кроме создания объектов типа Derive1 и Derive2.

#include<iostream.h>

#include<conio.h>

class Base

{ public:

Base () { cout << "Конструктор базового класса Base\n"; }

~Base () { cout << "Деструктор базового класса Base\n"; }

};

class Derive1: public Base

{ public:

Derive1 () { cout << "Конструктор производного класса Derive1\n"; }

~Derive1 () { cout << "Деструктор производного класса Derive1\n"; }

};

class Derive2: public Derive1

{ public:

Derive2 () { cout << "Конструктор производного класса Derive2\n"; }

~Derive2 () { cout << "Деструктор производного класса Derive2\n"; }

};

void main ()

{ clrscr ();

Derive1 d1; cout << endl;

Derive2 d2; cout << endl;

getch();

}

Результаты программы:

Конструктор базового класса Base

Конструктор производного класса Derive1 // объект d1 создан

Конструктор базового класса Base

Конструктор производного класса Derive1

Конструктор производного класса Derive2 // объект d2 создан

Деструктор производного класса Derive2

Деструктор производного класса Derive1

Деструктор базового класса Base // объект d2 уничтожен

Деструктор производного класса Derive1

Деструктор базового класса Base // объект d1 уничтожен

Комментарии к программе:

Функции-конструкторы выполняются при каждом создании объекта, на­чиная с класса Base — это естественный порядок выполнения. Для создания объекта производного класса необходима инициализация базового класса, так что конструктор должен выполняться.

С другой стороны, деструктор в производном классе должен выполняться раньше выполнения деструктора базового класса. Если деструктор базового класса выполнится раньше, то деструктор производного класса вообще не смо­жет выполниться. Поэтому деструкторы вызываются в порядке, обратном вызо­ву конструкторов.

Множественное наследование.

В языке С++ производный класс может наследовать от нескольких базо­вых классов. При объявлении производного класса базовые классы перечисля­ются через запятую. Причем при создании объекта конструкторы выполняются в порядке следования базовых классов слева направо.

Пример 37.

Программа иллюстрирует порядок работы конструктора и деструктора по схеме множественного наследования: (Base1, Base2) <- Derive. Она не делает ничего, кроме создания объектов типа Base1, Base2, Derive. Рассмотрим мо­дифицированную программу примера 36.

#include<iostream.h>

#include<conio.h>

class Base1

{ public:

Base1 () { cout << "Конструктор базового класса Base1\n"; }

~Base1 () { cout << "Деструктор базового класса Base1\n"; }

};

class Base2

{ public:

Base2() { cout << "Конструктор производного класс Base2 \n"; }

~ Base2() { cout << "Деструктор производного класса Base2\n"; }

};

class Derive: public Base1, Base2

{ public:

Derive () { cout << "Конструктор производного класса Derive\n"; }

~Derive () { cout << "Деструктор производного класса Derive\n"; }

};

void main ()

{ clrscr ();

Base1 b1; cout << endl;

Base2 b2; cout << endl;

Derive d; cout << endl;

getch();

}

Результаты программы:

Конструктор базового класса Base1 // объект b1 создан

Конструктор базового класса Base2 // объект b2 создан

Конструктор базового класса Base1

Конструктор базового класса Base2

Конструктор производного класса Derive // объект d создан

Деструктор производного класса Derive

Деструктор базового класса Base2

Деструктор базового класса Base1 // объект d уничтожен

Деструктор базового класса Base2 // объект b2 уничтожен

Деструктор базового класса Base1 // объект b1 уничтожен

Результаты работы программы показывают, что деструкторы выполняют­ся в порядке обратном по отношению к выполнению конструкторов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]