Выбрать главу

#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 (список_аргументов),

 .