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
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-объекта.
Как видите, конструкторы вызываются в порядке происхождения их классов, слева направо, в порядке их задания в списке наследования для класса
class derived: public base2, public base1 {};
то результаты выполнения предыдущей программы были бы такими:
Создание basе2-объекта.
Создание base1-объекта.
Создание derived-объекта.
Разрушение derived-объекта.
Разрушение base1-объекта.
Разрушение base2-объекта.
До сих пор ни один из предыдущих примеров не включал конструкторы, для которых требовалось бы передавать аргументы. В случаях, когда конструктор лишь производного класса требует передачи одного или нескольких аргументов, достаточно использовать стандартный синтаксис параметризованного конструктора. Но как передать аргументы конструктору базового класса? В этом случае необходимо использовать расширенную форму объявления конструктора производного класса, в которой предусмотрена возможность передачи аргументов одному или нескольким конструкторам базового класса. Вот как выглядит общий формат такого расширенного объявления.
конструктор_производного_класса (список_аргументов) :
base1 (список_аргументов),
base2 (список_аргументов),
.
.
.
baseN {список_аргументов);
{
тело конструктора производного класса
}
Здесь элементы
Рассмотрим следующую простую программу.
#include
using namespace std;
class base {
protected:
int i;
public:
base (int x) {
i = x;
cout << "Создание bаsе-объекта.\n";
}
~base() {cout << "Разрушение base1-объекта.\n";}
};