Шаг 22.
Определение производного класса

    На этом шаге мы рассмотрим правила определения производного класса.

В определении и описании производного класса приводится список базовых классов, из которых он непосредственно наследует данные и методы. Между именем вводимого (нового) класса и списком базовых классов помещается двоеточие. Например, при таком определении

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.

Таблица 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. Таким образом, объединения не могут использоваться при построении иерархии классов.

    На следующем шаге мы приведем пример определения производного класса.




Предыдущий шаг Содержание Следующий шаг