Простым (или одиночным) называется наследование, при котором производный класс имеет только одного родителя. Мы уже видели пример простого наследования при знакомстве с иерархией исключений. Формально наследование одного класса от другого можно задать следующей конструкций:
class имя_класса_потомка: [модификатор_доступа] имя_базового_класса { тело__класса }
Класс-потомок наследует структуру (все элементы данных) и поведение (все методы) базового класса. Модификатор доступа определяет доступность элементов базового класса в классе-наследнике. Квадратные скобки не являются элементом синтаксиса, а просто показывают, что заключенный в них модификатор может отсутствовать. Этот модификатор мы будем называть модификатором наследования.
При разработке различных классов мы использовали два модификатора доступа к элементам класса: public (общий) и private (приватный). При наследовании используется еще один (см. п. И в [1]) — protected (защищенный). Зачем он понадобился? Рассмотрим пример из реальной жизни. Типичной иерархией наследования является семья, состоящая из нескольких поколений. Все члены семьи имеют общую фамилию и участвуют в общественной жизни (public). С другой стороны, у каждого из членов семьи есть свои личные (private) интимные тайны. Однако члены семьи являются родственниками и участвуют еще и в общей семейной жизни. Семейные тайны хранятся внутри семьи и недоступны обществу, но известны всем членам семьи. Именно «семейная жизнь» объектов потребовала наличия модификатора protected.
Возможны четыре варианта наследования: класс от класса, класс от структуры, структура от структуры и структура от класса. Доступность элементов базового класса из классов-наследников изменяется в зависимости от модификаторов доступа в базовом классе и модификатора наследования. Однако при любых вариантах модификатора наследования приватные элементы базового класса недоступны в наследниках. В табл. 8.1 приведены все варианты доступности элементов базового класса в производном классе при любых вариантах модификатора наследования.
Если в качестве модификатора наследования записано слово public, то такое наследование называется открытым. Соответственно, при использовании модификатора protected мы имеем защищенное наследование, а слово private означает закрытое наследование.
Структуры редко участвуют в иерархии наследования, обычно их используют вполне традиционным способом — для реализации кортежей. Кортеж — это небольшой фиксированный контейнер с элементами разного типа. Общепринятой практикой является, правило — наследовать только от классов. Мы тоже будем стараться этому правилу следовать.
Таблица 8.1. Доступ к элементам базового класса в классе-наследнике
Модификатор доступа Модификатор Доступ в производном классе
в базовом классе наследования struct class
public Отсутствует public private
protected Отсутствует public private
private Отсутствует Нет доступа Нет доступа
public public public public
protected public protected protected
private public Нет доступа Нет доступа
public protected protected protected
protected protected protected protected
private protected Нет доступа Нет доступа
public private private private
protected private private private
private private Нет доступа Нет доступа
|