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