#include <iostream>
using namespace std;
class base {
public:
base() { cout <<"Создание base-объекта.\n"; }
~base(){ cout <<"Разрушение base-объекта.\n"; }
};
class derived1 : public base {
public:
derived1() { cout <<"Создание derived1-объекта.\n"; }
~derived1(){ cout <<"Разрушение derived1-объекта.\n"; }
};
class derived2: public derived1 {
public:
derived2() { cout <<"Создание derived2-oбъeктa.\n"; }
~derived2(){ cout <<"Разрушение derived2-oбъeктa.\n"; }
};
int main()
{
derived2 ob;
// Создание и разрушение объекта ob.
return 0;
}
отображаются такие результаты:
Создание base-объекта.
Создание derived1-объекта.
Создание derived2-oбъeктa.
Разрушение derived2-oбъeктa.
Разрушение derived1-объекта.
Разрушение base-объекта.
То же общее правило применяется и в ситуациях, когда производный класс наследует несколько базовых классов. Например, при выполнении этой программы
#include <iostream>
using namespace std;
class base1 {
public:
base1() { cout <<"Создание base1-объекта.\n"; }
~base1(){ cout <<"Разрушение base1-объекта.\n"; }
};
class base2 {
public:
base2() { cout <<"Создание bаsе2-объекта.\n"; }
~base2(){ cout <<"Разрушение basе2-объекта.\n"; }
};
class derived: public base1, public base2 {
public:
derived() { cout <<"Создание derived-объекта.\n"; }
~derived(){ cout <<"Разрушение derived-объекта.\n"; }
};
int main()
{
derived ob;
// Создание и разрушение объекта ob.
return 0;
}
генерируются такие результаты:
Создание base1-объекта.
Создание basе2-объекта.
Создание derived-объекта.
Разрушение derived-объекта.
Разрушение basе2-объекта.
Разрушение base1-объекта.
Как видите, конструкторы вызываются в порядке происхождения их классов, слева направо, в порядке их задания в списке наследования для класса derived. Деструкторы вызываются в обратном порядке, справа налево. Это означает, что если бы класс base2 стоял перед классом base1 в списке класса derived, т.е. в соответствии со следующей инструкцией:
class derived: public base2, public base1 {};
то результаты выполнения предыдущей программы были бы такими:
Создание basе2-объекта.
Создание base1-объекта.
Создание derived-объекта.
Разрушение derived-объекта.
Разрушение base1-объекта.
Разрушение base2-объекта.
До сих пор ни один из предыдущих примеров не включал конструкторы, для которых требовалось бы передавать аргументы. В случаях, когда конструктор лишь производного класса требует передачи одного или нескольких аргументов, достаточно использовать стандартный синтаксис параметризованного конструктора. Но как передать аргументы конструктору базового класса? В этом случае необходимо использовать расширенную форму объявления конструктора производного класса, в которой предусмотрена возможность передачи аргументов одному или нескольким конструкторам базового класса. Вот как выглядит общий формат такого расширенного объявления.
конструктор_производного_класса (список_аргументов) :
base1 (список_аргументов),
base2 (список_аргументов),
.