До сих пор ни в одном из примеров наследования базовый класс не содержал конструкторов, использующих параметры. До тех пор, пока конструкторы не имеют аргументов, от производного класса не требуется каких-либо специальных действий. Однако, когда базовый класс имеет конструктор с аргументами, производные классы должны явным образом обрабатывать эту ситуацию путем передачи базовому классу необходимых аргументов. Для этого используется расширенная форма конструкторов производных классов, в которые передаются аргументы конструкторам базового класса. Эта расширенная форма показана ниже:
порожденный конструктор (список_аргументов): базовый 1(список_аргументов), базовый2(список_аргументов), ..., базовыйЗ(список_аргументов)
{
...
}
Здесь под базовый1,... базовыйN обозначены имена базовых классов, наследуемые производным классом. Обратим внимание, что с помощью двоеточия конструктор производного класса отделяется от списка конструкторов базового класса. Список аргументов, ассоциированный с базовыми классами, может состоять из констант, глобальных переменных или параметров конструктора производного класса. Поскольку инициализация объекта происходит во время выполнения программы, можно использовать в качестве аргумента любой идентификатор, определенный в области видимости класса.
Следующая программа иллюстрирует, как передаются аргументы базовому классу из производного класса:
#include <iostream.h>
class X {
protected:
int a;
public:
X (int i) ( a = i; )
};
class Y {
protected:
int b;
public:
У (int i) { b = i; }
};
// Z наследует как от X, так и от Y
class Z: public X, public Y {
public:
/* Инициализация X и Y через конструктор Z. Обратим внимание, что z на самом деле не использует х или у, но если потребуется, то может */
Z (int х, int у): X(x) , Y(y)
{
cout << "Initializing\n";
}
int make_ab() { return a*b; }
};
int main()
{
Z i (10, 20);
cout << i.make_ab();
return 0;
}
Обратим внимание, что конструктор класса Z фактически не использует параметры прямо. Вместо этого в данном примере они просто передаются конструкторам классов X и Y. Вместе с тем при необходимости, разумеется, класс Z может использовать эти и другие аргументы.