Наследование

В языке 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. Этот пример соответствует схеме.


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

Объектно орентированое программирование (ООП)
Класс
Порядок вызова конструкторов
Виртуальные функции

сип дома
euroecodom.ru