#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 {
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;
}
Конструктор производного класса может использовать любые (или все) параметры, которые им объявлены для приема, независимо от того, передаются ли они (один или несколько) базовому классу. Другими словами, тот факт, что некоторый аргумент передается базовому классу, не мешает его использованию и самим производным классом. Например, этот фрагмент кода совершенно допустим.
class derived: public base {
int j;
public:
// Класс derived использует оба параметра x и у а также передает их классу base.
derived(int х, int у): base(х, у){
j = х*у;
cout << "Создание derived-объекта.\n";
}
// . . .
};
При передаче аргументов конструкторам базового класса следует иметь в виду, что передаваемый аргумент может содержать любое (действительное на момент передачи) выражение, включающее вызовы функций и переменные. Это возможно благодаря тому, что C++ позволяет выполнять динамическую инициализацию данных.
Когда базовый класс наследуется закрытым способом (как private-класс), все его члены (открытые, защищенные и закрытые) становятся private-членами производного класса. Но при определенных обстоятельствах один или несколько унаследованных членов необходимо вернуть к их исходной спецификации доступа. Например, несмотря на то, что базовый класс наследуется как private-класс, определенным его public-членам нужно предоставить public-статус в производном классе. Это можно сделать двумя способами. Во-первых, в производном классе можно использовать объявление using (этот способ рекомендован стандартом C++ для использования в новом коде). Но мы отложили рассмотрение директивы using до темы пространств имен. (Основное назначение директивы using— обеспечить поддержку пространств имен.) Во-вторых, можно настроить доступ к унаследованному члену с помощью объявлений доступа. Объявления доступа все еще поддерживаются стандартом C++, но в последнее время активизировались возражения против их применения, а это значит, что их не следует использовать в новом коде. Поскольку они все еще используются в С++-коде, мы уделим внимание этой теме.
Объявление доступа имеет такой формат:
имя_базового_класса::член;
Объявление доступа восстанавливает уровень доступа унаследованного члена, в результате чего он получает тот уровень доступа, который был у него в базовом классе.