- •Чистые виртуальные функции и абстрактные классы
- •Производные классы с конструкторами и деструкторами
- •Виртуальные деструкторы
- •Обобщенный пример наследования
- •Модульность классов
- •Расширяющяся иерархия классов
- •Узловые классы
- •Множественное наследование классов
- •Шаблоны
- •Шаблоны функций
- •Перегрузка шаблонов функций
- •Шаблоны классов
- •Друзья Дружественные функции
- •Дружественные классы
- •Статические элементы класса
Производные классы с конструкторами и деструкторами
Каждый класс — базовый и производный может иметь конструктор и деструктор. В каком порядке выполняются эти функции при простом и множественном наследовании? Рассмотрим этот вопрос на модельных примерах.
Простое наследование.
Пример 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 уничтожен
Результаты работы программы показывают, что деструкторы выполняются в порядке обратном по отношению к выполнению конструкторов.
