Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.doc
Скачиваний:
7
Добавлен:
25.04.2019
Размер:
1.34 Mб
Скачать

2. Механизм наследования. Полиморфизм

Наследование является фундаментальным принципом объектно-ориентированного подхода и механизмом формирования новых абстрактных типов. Оно способствует упрощению повторного использования кода, повышению структурированности программ, их модифицируемости и читаемости. С++ поддерживает многообразие форм и способов наследования, включая открытое, защищенное и закрытое наследование, одиночное и множественное наследование, виртуальное и невиртуальное наследование.

2.1. Формы наследования. Базовые и производные классы

При наследовании один или несколько классов являются базовыми и наследуют свои компоненты другим классам, которые, в свою очередь, называют производными6. Наследование при этом следует понимать как передачу производному классу абстрактной связи с наследуемыми компонентами. Производный класс может выступать как базовый для других классов, которые также могут быть базовыми. Производный класс наследует все компоненты независимо от их видов, типов и уровня доступности. Однако явный доступ к унаследованным компонентам для производного класса не всегда возможен. Он также может вводить новые компоненты и переопределять некоторые из унаследованных.

Наиболее простой формой наследования является одиночное наследование. При одиночном наследовании любой класс может быть порожден только от одного базового класса, но от одного класса можно получить несколько новых производных классов. Если класс порождается сразу от нескольких базовых классов, говорят уже о множественном наследовании. Различают открытое (public), защищенное (protected) и закрытое (private) наследование. При открытом наследовании производный класс наследует все компоненты базового класса с теми спецификаторами доступности, какие были в базовом классе. Интерфейс базового класса как бы добавляется к интерфейсу производного. Защищенное наследование характеризуется тем, что все общедоступные компоненты базового класса получают в производном классе спецификатор protected и, таким образом, скрываются от доступа извне. При закрытом наследовании все унаследованные компоненты приобретают статус закрытых и не доступны ни для объектов производного класса, ни для внешних объектов.

Наследование, будучи механизмом порождения новых типов, является также и моделью отношения между понятиями предметной области. Различные формы наследования моделируют разные виды отношений. Так, открытое наследование представляет собой модель отношения «быть разновидностью», в которой базовый класс описывает общее понятие, а производный класс – частный случай. Примером может быть отношение между классами «окружность» и «закрашенная окружность» (все закрашенные окружности являются окружностями, некоторые окружности не закрашены). Защищенное наследование способно моделировать отношение «использования», в котором базовый класс предоставляет свою функциональность для реализации возможностей производного класса. Примером является отношение класса «календарная дата» и класса «сотрудник организации» (в число компонент класса сотрудников может войти, например, дата их приема на работу). Закрытое наследование может служить моделью отношения «быть частью».

Для повышения наглядности отношение наследования между классами изображают ориентированным графом. Вершины такого графа соответствуют классам, а дуги отображают отношение наследования. Направление дуг выбирается от производного класса к базовому (иногда берут противоположное направление). В модели одиночного наследования получаемый граф всегда является деревом; в случае множественного наследования граф может содержать несколько корневых вершин и даже включать параллельные «цепочки» наследования.

Общий формат определения производного класса при отсутствии множественного наследования выглядит так:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]