<<
>>

Единичное наследование

Форма записи класса-наследника имеет вид:

:

{}

При уровне доступа public сохраняется уровень видимости элементов базового класса.

При уровне доступа private все элементы производного класса считаются приватными, то есть невидимыми для клиентов.

Кроме того, приватные производные классы закрывают доступ ко всем элементам классов-предков со стороны всех классов-потомков.

Положим, что существует родительский класс:

Будем считать, что у этого класса есть публичный и приватный наследники: class Child_1: public Parent_class {...};

class Child_2: private Parent_class {...};

При приватном наследовании в экземплярах класса-наследника нет элементов, которые видят клиенты. Для восстановления видимости элемента применяется его повторное экспортирование. Оно отменяет скрытность элемента. Например:

class Child_3: private Parent_class {

Parent_class :: c;

}

ООП на языке C++

479

Теперь в экземплярах С1"а^_3 доступен элемент с (как если бы наследование было публичным).
Двойное двоеточие — это операция разрешения области видимости. Она задает класс, где определен элемент.

Рассмотрим класс:

Вложенный в него класс Element определяет элемент связанного списка, включающий два компонента — поле целого типа и указатель на элемент. Этот класс размещен в приватной секции, что скрывает его от других классов.
Элементы- данные в Element публичны, то есть видимы в объемлющем классе Linked_list. Если бы они были приватными, то для обеспечения видимости элементов-данных пришлось бы объявить класс Element другом класса Linked_list. Заметим, что у вложенных классов нет никаких специальных прав доступа к элементам объемлющего класса. Только статические элементы-данные объемлющего класса видимы методам вложенного класса.

Объемлющий класс Linked_list имеет один элемент-данные, это указатель на заголовок списка. Он содержит конструктор, обнуляющий значение указателя.

Четыре элемента-функции обеспечивают вставку элементов в список (с головы или хвоста), удаление элементов (с головы), проверку пустоты списка.

Определим классы стек и очередь, которые станут публичными потомками-на- следниками класса связанный список:

продолжение #

480 Глава 16. Объектно-ориентированное и аспектно-ориентированное программирование

return Linked_list :: delete_at_head ( );

};

};

Заметим, что объекты как подкласса Stack, так и подкласса Queue имеют доступ к функции empty ( ) из родительского класса Linked_list (так как это публичное наследование). Новые методы подклассов push(), pop(), enqueue(), dequeue() на самом деле лишь вызывают соответствующие методы родительского класса, которые и выполняют необходимую работу.

Оба подкласса содержат по конструктору (который ничего не делает). При создании объекта неявно вызывается конструктор подкласса. Далее вызывается конструктор родительского класса (в нашем примере именно он и выполняет необходимую инициализацию).

Однако здесь возникает серьезная проблема. Поскольку наследование публичное, объект класса Stack имеет доступ к операции insert_at_tail ( ) родительского класса, а это разрушает целостность стека.

Аналогично объекту класса Queue доступна операция insert_at_head ( ). Эти нежелательные вызовы вполне возможны, поскольку и класс Stack, и класс Queue являются подтипами типа Linked_list, а значит их экземпляры (в соответствии с принципом подстановки) могут использоваться вместо экземпляров Linked_list.

Если задуматься, то следует сказать правду: функциональное сходство стека и очереди со связанным списком весьма сомнительного свойства и не выдерживает теста «является», поскольку эти дети слабо похожи на своего родителя. Следовательно, нужно отказаться от родства и применить «запретное» наследование для конструирования, которое в языке С++ поддерживается механизмом приватного наследования. Заметим, что приватным подклассам придется скопировать метод empty (), поскольку он будет скрыт от их экземпляров. В итоге получим следующие подклассы:

Обратим внимание, что потребовался повторный экспорт операции empty ( ), поскольку она стала скрытой.

ООП на языке C++

481

Две версии стека и очереди иллюстрируют различия между подтипами и подклассами, которые не являются подтипами. Связанный список может считаться обобщением стеков и очередей, но только на уровне реализации. С этой точки зрения вполне естественно наследование от класса связанного списка для определения классов стек и очередь. Тем не менее ни один из них не называется подтипом связанного списка, поскольку превращает публичные элементы родительского класса в приватные, запрещая клиентам соответствующий доступ.

<< | >>

Еще по теме Единичное наследование:

  1. § 40 Наследование в боковой линии. – В каких случаях женщина пользуется правом представления. – Наследование в родовом имении сообразно происхождению имения. – Наследование в благоприобретенном имении. – Предпочтение полнородных неполнородным (ст. 1133–1140).
  2. ПРЕДСТАВЛЕНИЕ ЕДИНИЧНОЕ
  3. 2. Общий вывод из единичных фактов
  4. § 43 Особые порядки наследства. – Наследование и раздел у крестьян по обычаю. – Закон наследования в прибалтийских губерниях.
  5. § 38 Когда открывается наследство по русскому закону. – Ограничения наследственного права. – Имущество, составляющее предмет наследования. – Отношение наследования по закону к завещанию. – Кто может быть наследником?
  6. § 35 Поводы к открытию наследства. – Имущества, составляющие наследство. – Способные, неспособные и недостойные к наследованию. – Призвание к наследованию и приобретение наследства. – Договоры о наследстве и предварительный отказ от наследства. – Прямой и непрямой наследник. – Праздное и выморочное наследство.
  7. § 32 Общие понятия о наследстве и о наследственном преемстве. – Отношение завещания к законному наследованию. – Римское господство завещательного начала и отрицание его в германском праве. – Историческое развитие наследственного порядка в римском праве. – Допущение к наследованию кровных родственников.
  8. § 41 Наследование родителей. – Наследование супругов. – Выдел указной части. – Особливые преимущества вдового супруга при выделе. – Выдел из имения свекра и тестя. – Свойство права на иск о выделе и переход сего права к наследникам. – Отличия в Черниговской и Полтавской губерниях. – Особливые постановления по разным ведомствам (ст. 1141–1147).
  9. § 34 Смешанные системы в новейших законодательствах. – Происходящее от различия сих систем различие в порядке раздела и в допущении права представления. – Ограничение наследственного права пределами родства. – Ограничение женщин. – Разделение наследства между родами. – Возвращение подаренного родителями. – Наследование супругов и незаконных детей и родителей. – Закон наследования в Англии.
  10. Виды наследования.
  11. Понятие наследования.
  12. § 37 Исторический очерк русского наследственного права. – Первые начала наследования по договорам с греками, по Русской Правде и судебникам. – Влияние родового начала и политической борьбы с боярством на постановления о наследстве. – Отличия в наследовании между поместьями и вотчинами. – Образование вдовьей и дочерней части. – Право женщин-родственниц при мужчинах. – Недоумения о праве представления. – Соединение поместий с вотчинами и указ о единонаследии. – Отмена его. – Причины затруднений и
  13. II. НАСЛЕДОВАНИЕ