Программирование на C и C++

Онлайн справочник программиста на C и C++

Передача параметров в базовый класс

До сих пор ни в одном из примеров наследования базовый класс не содержал конструкторов, использующих параметры. До тех пор, пока конструкторы не имеют аргументов, от производно­го класса не требуется каких-либо специальных действий. Однако, когда базовый класс имеет конструктор с аргументами, производные классы должны явным образом обрабатывать эту ситу­ацию путем передачи базовому классу необходимых аргументов. Для этого используется расши­ренная форма конструкторов производных классов, в которые передаются аргументы конструк­торам базового класса. Эта расширенная форма показана ниже:

порожденный конструктор (список_аргументов): базовый 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 может использовать эти и другие аргументы.