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-объекта.

Как видите, конструкторы вызываются в порядке происхождения их классов, слева направо, в порядке их задания в списке наследования для класса derived. Деструкторы вызываются в обратном порядке, справа налево. Это означает, что если бы класс base2 стоял перед классом base1 в списке класса derived, т.е. в соответствии со следующей инструкцией:

class derived: public base2, public base1 {};

то результаты выполнения предыдущей программы были бы такими:

Создание basе2-объекта.

Создание base1-объекта.

Создание derived-объекта.

Разрушение derived-объекта.

Разрушение base1-объекта.

Разрушение base2-объекта.

Передача параметров конструкторам базового класса

До сих пор ни один из предыдущих примеров не включал конструкторы, для которых требовалось бы передавать аргументы. В случаях, когда конструктор лишь производного класса требует передачи одного или нескольких аргументов, достаточно использовать стандартный синтаксис параметризованного конструктора. Но как передать аргументы конструктору базового класса? В этом случае необходимо использовать расширенную форму объявления конструктора производного класса, в которой предусмотрена возможность передачи аргументов одному или нескольким конструкторам базового класса. Вот как выглядит общий формат такого расширенного объявления.

конструктор_производного_класса (список_аргументов) :

 base1 (список_аргументов),

 base2 (список_аргументов),

 .

 .

 .

 baseN {список_аргументов);

{

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

}

Здесь элементы base1-baseN означают имена базовых классов, наследуемых производным классом. Обратите внимание на то, что объявление конструктора производного класса отделяется от списка базовых классов двоеточием, а имена базовых классов разделяются запятыми (в случае наследования нескольких базовых классов).

Рассмотрим следующую простую программу.

#include

using namespace std;

class base {

 protected:

  int i;

 public:

  base (int x) {

   i = x;

   cout << "Создание bаsе-объекта.\n";

  }

  ~base() {cout << "Разрушение base1-объекта.\n";}

};

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги