
Программирование
на языке Си++
1

Модуль 6.
НАСЛЕДОВАНИЕ И ПОЛИМОРФИЗМ
Виртуальные функции и позднее связывание Множественное наследование Виртуальный базовый класс
Чистые виртуальные функции и абстрактные классы
2

Модуль 6. НАСЛЕДОВАНИЕ И ПОЛИМОРФИЗМ
Понятие наследования в ООП и его реализация в Си++ (начало)
Наследование — механизм повторного использования определенных в составе классов компонентных данных и методов посредством порождения одних (производных) классов на основе других (базовых). Объединенные отношением наследования классы образуют иерархию наследования, чаще всего имеющую вид дерева
Множественное наследование — порождение производного класса от двух и более базовых. Применение множественного наследования превращает иерархию наследования из дерева в направленный ациклический граф
Определение производного класса
class <имя типа> : <список базовых классов> { <определение компонентов> }
где <список базовых классов> содержит их имена, а также необязательные спецификаторы доступа к компонентам каждого класса
3

Модуль 6. НАСЛЕДОВАНИЕ И ПОЛИМОРФИЗМ
Понятие наследования в ООП и его реализация в Си++ (продолжение)
Производному классу в языке Си++ доступны общедоступные (public) и защищенные (protected)
компоненты базовых классов. С учетом вариантов спецификации доступа к компонентам базовых классов из производных, а также спецификации доступа в самих базовых классах, итоговая картина прав доступа имеет вид, показанный на следующем слайде
При допустимом языком Си++ множественном наследовании возможно дублирование объектов непрямых базовых классов в составе общего предка. В тех случаях, когда такое дублирование нежелательно, базовый класс можно объявить
виртуальным
4

Модуль 6. НАСЛЕДОВАНИЕ И ПОЛИМОРФИЗМ
Понятие наследования в ООП и его реализация в Си++ (окончание)
Спецификатор в |
Спецификатор в |
Доступ в |
списке базовых |
теле базового |
производном классе |
классов |
класса |
|
|
|
|
не указан |
private |
недоступны |
|
|
|
не указан |
protected |
private |
|
|
|
не указан |
public |
private |
|
|
|
private |
private |
недоступны |
|
|
|
private |
protected |
private |
|
|
|
private |
public |
private |
|
|
|
protected |
private |
недоступны |
|
|
|
protected |
protected |
protected |
|
|
|
protected |
public |
protected |
|
|
|
public |
private |
недоступны |
|
|
|
public |
protected |
protected |
|
|
|
public |
public |
protected |
|
|
|
5

Модуль 6. НАСЛЕДОВАНИЕ И ПОЛИМОРФИЗМ
Множественное наследование. Виртуальные базовые классы
Множественное наследование — порождение класса-
потомка от двух и более базовых классов
Определение производного класса
class <имя типа> : <список базовых классов> { <определение компонентов> };
При допустимом языком Си++ множественном наследовании возможно дублирование объектов непрямых базовых классов в составе общего предка. В тех случаях, когда такое дублирование нежелательно, базовый класс можно объявить
виртуальным
6

Модуль 6. НАСЛЕДОВАНИЕ И ПОЛИМОРФИЗМ
Виртуальные, чистые виртуальные функции и абстрактные классы
Для отражения в реализации иерархии классов ситуации, при которой одна и та же функция базового класса должна различным образом выполняться в классах-потомках, служат виртуальные функции. Классы, включающие виртуальные функции, называются полиморфными. Виртуальными могут быть только нестатические компонентные функции классов
Компонентная виртуальная функция (базового) класса, не имеющего в данном классе реализации, называется чистой виртуальной функцией, а класс, содержащий хотя бы одну чистую виртуальную функцию, — абстрактным
7

Список литературы
[КР92] Керниган Б., Ритчи Д. Язык программирования Си / Пер. с англ. — М.: Финансы и статистика, 1992. — 272 с.
[КР06] Керниган Б., Ритчи Д. Язык программирования C / Пер. с англ. — М.:
Вильямс, 2006. — 304 с.
[ЛЛ01] Липпман С., Лажойе Ж. Язык программирования C++. Вводный курс.
— СПб.: Невский диалект, 2001. — 1104 с.
[Под03] Подбельский В.В. Язык Си++: Учеб. пособие. — 5-е изд. — М.: Финансы и статистика, 2003. – 560 с., ил.
[Под04] Подбельский В.В., Фомин С.С. Программирование на языке Си. – 2-е доп. изд. – М.: Финансы и статистика, 2004. – 600 с.
[Стр08] Страуструп Б. Язык программирования С++. Специальное издание.
— СПб.: Невский диалект, 2008. — 1104 с.
8