- •Оглавление
- •Наследование
- •Синтаксис объявления производного класса
- •Доступ к элементам базового класса в классе-наследнике
- •Механизм наследования
- •Конструктор и деструктор производного класса
- •Абстрактные и конкретные классы
- •Полиморфизм
- •Виртуальные функции
- •Правила описания и создания виртуальных функций
- •Int a,b; // но для производного класса они доступны
- •Int a,b; // но для производного класса они доступны
Наследование
Наследование – принцип ООП, который позволяет на основе одного класса объявить другой класс. Наследование используется для поддержки ООП.
При наследовании:
класс-предок (родитель, порождающий класс);
класс-наследник (потомок, порожденный класс).
В С++ порождающий класс называется базовым, а порожденный – производным.
Каждый производный класс может выступать базовым классом.
Отношения между родительским классом и его потомками называются иерархией наследования. Глубина наследования не ограничена.
Простым называется наследование, при котором производный класс имеет только одного родителя.
Множественное наследование – способность класса наследовать характеристики более чем одного базового класса.
Объекту базового класса можно присвоить значение другого объекта этого же класса, а также любого объекта-потомка.
Указатель и ссылка на базовый класс совместимы по типам соответственно с указателем и ссылкой на производный класс.
Синтаксис объявления производного класса
Простое наследование:
class имя_производного_Класса:
[спецификатор наследования] имя_базового класса
{
тело класса
};
Множественное наследование:
class имя_производного_Класса:
[спецификатор наследования1] имя_базового класса1,
[спецификатор наследования2] имя_базового класса2,
...
{ тело класса };
Спецификатор наследования определяет доступность элементов базового класса в производном классе.
Если спецификатор наследования не указан, то по умолчанию базовый класс наследуется как закрытый.
Имеются 3 спецификатора наследования:
Public (открытый)
Private (закрытый)
Protected (защищенный )
Если спецификатор наследования public, все открытые компоненты и функции-члены интерфейса базового класса открыты и в производном классе, а закрытые – закрыты и недоступны.
Если спецификатор наследования private, все открытые компоненты и функции-члены интерфейса базового класса закрыты в производном классе, также как и закрытые – закрыты и недоступны. Личные (private) члены базового класса доступны в производном классе только через вызов соответствующих функций-членов базового класса.
Спецификатор наследования protected эквивалентен спецификатору private с единственным исключением: защищенные члены базового класса доступны для членов всех производных классов этого базового класса, вне базового или производных классов защищенные члены недоступны.
Доступ к элементам базового класса в классе-наследнике
Доступность элементов базового класса из классов-наследников изменяется в зависимости от спецификаторов доступа в базовом классе и спецификатора наследования.
Спецификатор доступа в базовом классе |
Спецификатор наследования |
Доступ в производном классе |
public |
отсутствует |
private |
public |
private |
private |
public |
public |
public |
public |
protected |
protected |
|
|
|
protected |
отсутствует |
private |
protected |
private |
private |
protected |
public |
protected |
protected |
protected |
protected |
|
|
|
private |
отсутствует |
недоступны |
private |
private |
недоступны |
private |
public |
недоступны |
private |
protected |
недоступны |
