class derived: public base {

  int j;

 public:

  // Класс derived использует параметр x, а параметр у передается конструктору класса base.

  derived(int x, int y): base(y){

   j = x;

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

  }

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

  void show() { cout << i << " " << j << "\n"; }

};

int main()

{

 derived ob(3, 4);

 ob.show(); // отображает числа 4 3

 return 0;

}

Здесь конструктор класса derived объявляется с двумя параметрами, х и у. Однако конструктор derived() использует только параметр х, а параметр у передается конструктору base(). В общем случае конструктор производного класса должен объявлять параметры, которые принимает его класс, а также те, которые требуются базовому классу. Как показано в предыдущем примере, любые параметры, требуемые базовым классом, передаются ему в списке аргументов базового класса, указываемого после двоеточия.

Рассмотрим пример программы, в которой демонстрируется наследование нескольких базовых классов.

#include

using namespace std;

class base1 {

 protected:

  int i;

 public:

  base1(int x) {

   i = x;

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

  }

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

};

class base2 {

 protected:

  int k;

 public:

  base2(int x) {

   k = x;

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

  }

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

};

class derived: public base1, public base2 {

  int j;

 public:

  derived(int x, int y, int z): base1(y), base2(z){

   j = x;

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

  }

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

  void show() { cout << i << " "<< j << " "<< k << " \ n"; }

};

int main()

{

 derived ob(3, 4, 5);

 ob.show(); // отображает числа 4 3 5

 return 0;

}

Важно понимать, что аргументы для конструктора базового класса передаются через аргументы, принимаемые конструктором производного класса. Поэтому, даже если конструктор производного класса не использует никаких аргументов, он, тем не менее, должен объявить один или несколько аргументов, если базовый класс принимает один или несколько аргументов. В этой ситуации аргументы, передаваемые производному классу, "транзитом" передаются базовому. Например, в следующей программе конструкторы base1() и base2(), в отличие от конструктора класса derived, принимают аргументы.

#include

using namespace std;

class base1 {

 protected:

  int i;

 public:

  base1(int x) {

   i=x;

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

  }

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

};

class base2 {

 protected:

  int k;

 public:

  base2(int x) {

   k = x;

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

  }

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

};

class derived: public base1, public base2 {

 public:

  /* Конструктор класса derived не использует параметров, но должен объявить их, чтобы передать конструкторам базовых классов.

  */

  derived(int х, int у): base1(х), base2(у){

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

  }

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

  void show() { cout << i << " " << k << "\n"; }

};

int main()

{

 derived ob(3, 4);

 ob.show(); // отображает числа 3 4

 return 0;

}

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

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

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