Скачиваний:
316
Добавлен:
28.03.2021
Размер:
378.53 Кб
Скачать

37. Наследование, базовый и производный классы. Иерархия классов

Наследование (inheritance) – это процесс создания новых классов, называемых наследниками или производными классами из уже существующих или базовых классов. Это так называемое повторное использование кода или code reuse. Производный класс получает все возможности базового класса, но может быть усовершенствован за счёт добавления новых возможностей. Базовый класс при этом остаётся неизменным. Наследование не работает в обратном направлении.

Выигрыш от наследования состоит в том, что можно код использовать несколько раз. Имея написанный и отлаженный базовый класс, мы можем его не модифицировать, при этом механизм наследования позволит приспособить базовый класс для работы в других различных ситуациях.

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

Определение производного класса:

class CountDn : public Counter

Порядок вызова конструкторов соответствует порядку следования классов иерархии наследования. Порядок вызова деструктора всегда обратен порядку вызова конструктора: сначала вызывается деструктор наследника, а затем деструкторы всех базовых классов.

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

Пример нашей программы начинается с описания базового класса employee.

Этот класс содержит фамилии служащих и их номера. Он порождает три новых класса: manager, scientist и laborer. Классы manager и scientist содержат добавочную информацию об этих категориях служащих.

38. Определение производного класса, доступ к содержимому базового класса. Использование конструкторов, полей и методов базового класса.

Определение производного класса:

class CountDn : public Counter

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

Методы производного класса имеют доступ к элементам базового класса, которые объявлены со спецификатором public или protected. К элементам, объявленным в базовом классе как private методы производного класса доступа не имеют.

Для установки отношения наследования после название класса ставится двоеточие, затем идет название класса, от которого мы хотим унаследовать функциональность. В этом отношении класс Person еще будет называться базовым классом, а Employee - производным классом.

Перед названием базового класса также можно указать спецификатор доступа.

Важной особенностью производного класса, является то, что хоть он и может использовать все методы и элементы полей protected и public базового класса, но он не может обратиться к конструктору с параметрами. Если конструкторы в производном классе не определены, при создании объекта сработает конструктор без аргументов базового класса. А если нам надо сразу при создании объекта производного класса внести данные, то для него необходимо определить свои конструкторы.

В производном классе необходимо явно определять свои конструкторы, деструкторы и перегруженные операторы присваивания из-за того, что они не наследуются от базового класса. Но их можно вызвать явным образом при определении конструктора, деструктора или перегрузки оператора присваивания производного класса, например таким образом (для конструктора): Конструктор_Производного_Класса (/*параметры*/) : Конструктор_Базового_Класса ( /*параметры*/) { } .