На этом шаге мы рассмотрим правила определения производного класса.
В определении и описании производного класса приводится список базовых классов, из которых он непосредственно
наследует данные и методы. Между именем вводимого (нового) класса и списком базовых классов помещается
двоеточие. Например, при таком определении
class S: X, Y, Z { ... } ;
класс S порожден классами X, Y, Z, откуда он наследует компоненты. Наследование компонента не
выполняется, если его имя будет использовано в качестве имени компонента в определении производного класса
S. Как уже говорилось, по умолчанию из базовых классов наследуются методы и данные со спецификаторами
доступа - public (общедоступные) и protected (защищенные).
В порожденном классе эти унаследованные компоненты получают статус доступа private, если новый класс
определен с помощью ключевого слова class, и статус доступа public, если новый класс определен
как структура, т.е. с помощью ключевого слова struct.
Таким образом, при определении класса
struct J: X, Z { ... };
любые наследуемые компоненты классов X, Z будут иметь в классе J статус общедоступных
(public).
Пример:
class В { protected: int t; public: char u; }; class E: В { ... }; // t, u наследуются как private. struct S: В { ... }; // t, u наследуются как public.
Явно изменить умалчиваемый статус доступа при наследовании можно с помощью спецификаторов доступа:
- private,
- protected и
- public.
Эти спецификаторы доступа указываются в описании производного класса непосредственно перед
нужными именами базовых классов. Учитывая определение класса B, можно ввести следующие
производные классы:
class M: protected В { ... }; // t, u наследуются как protected. class P: public В { ... }; //t - protected, u - public. class D: private В { ... }; //t, u наследуются как private. struct F: private В {...}; //t, u наследуются как private. struct G: public В { ... };//t - protected, u - public.
Соглашения о статусах доступа при разных сочетаниях базового и производного классов иллюстрирует таблица 1.
Таблица 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 | недоступны | недоступны |
Обратите внимание на тот факт, что ни базовый класс, ни производный не могут быть объявлены с помощью ключевого
слова union. Таким образом, объединения не могут использоваться при построении иерархии классов.
На следующем шаге мы приведем пример определения производного класса.