На этом шаге мы рассмотрим правила определения производного класса.
В определении и описании производного класса приводится список базовых классов, из которых он непосредственно
наследует данные и методы. Между именем вводимого (нового) класса и списком базовых классов помещается
двоеточие. Например, при таком определении
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.
Явно изменить умалчиваемый статус доступа при наследовании можно с помощью спецификаторов доступа:
Эти спецификаторы доступа указываются в описании производного класса непосредственно перед нужными именами базовых классов. Учитывая определение класса 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.
Доступ в базовом классе | Спецификатор доступа перед базовым классом | Доступ в производном классе | |
---|---|---|---|
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. Таким образом, объединения не могут использоваться при построении иерархии классов.
На следующем шаге мы приведем пример определения производного класса.