Справочник по C/C++
Наследование

В языке C++ один класс может наследовать свойства другого. Унаследованный класс называется базовым классом, а класс-наследник — производным классом. Когда класс наследует другой, формируется иерархия классов. Общая форма наследования классов имеет следующий вид.

class имя_класса : спецификатор_доступа имя_базового_класса {
	//...
}

Здесь спецификатор_доступа определяет способ наследования базового класса и указывается с помощью одного из трёх ключевых слов: private, public или protected. Его можно опустить, в этом случае предполагается использование по умолчанию спецификатора public, если базовый класс является структурой (struct), или private, если базовый класс является классом (class).

Приватные члены(private) не доступны для клиента, открытые члены(public) доступны для клиента, а защищённый режим доступа (protected) используется когда необходимо унаследовать приватные члены. При наследовании нескольких классов(множественное наследование) используется список имён классов, разделённых запятыми. Например.

class X{
}
class Y{
}
class Z : public X, private Y{
}

Далее в таблице указывается изменение режима доступа к членам, при наследовании от базового класса к производному, в зависимости от значения спецификатор_доступа.

Базовый класс    Режим наследования    Производный класс
private
protected
public
public
--------->
Недоступен
protected
public
 
private
protected
public
protected
--------->
Недоступен
protected
protected
 
private
protected
public
private
--------->
Недоступен
private
private

Конструкторы с параметрами при наследовании

Иногда требуется при создании производного объекта в программе передавать параметры конструктора базовому классу. В этом случае в определение конструктора, после имени метода и перечислении его параметров, после двоеточия поставить имя базового конструктора с необходимыми параметрами которые будут передаваться.<.p>

имя_класса :: имя_класса (параметра_конструктора) : имя_базового_класса (параметры_конструктора_базового_класса) {
	//...
}

Например.<.p>

class X{
protected:
	int x;
public:
	X(int i);
};

class Y : public X{
	int y;
public
	Y(int i, j);
};

X :: X(int i){
	x = i;
}

Y :: Y(int i, j) : X(i){	//передача аргумента базовому классу
	y = j;
}

Виртуальные базовые классы

При множественном наследовании базовый класс не может быть задан в производном классе более одного раза.

class Der: Base, Base {...};

В то же время базовый класс может быть передан производному классу более одного раза косвенно:

class X: public Base {...};
class Y: public Base {...};
class Derive: public X, public Y {...};

Этот пример соответствует схеме наследования.

Каждый объект класса Derive будет иметь два подобъекта класса Base. Чтобы избежать неоднозначности при обращении к членам базового объекта Base, можно объявить этот класс виртуальным. Для этого используется ключевое слово virtual.

class X: virtual public Base {...};
class Y: virtual public Base {...};
class Derive: public X, public Y {...};

Теперь класс Derive имеет только один подобъект класса Base. Этот пример соответствует схеме.


Смотрите также