Skip to content

CPP 06. Наследование в CPP. Построение иерархии классов. Выделение общей части группы классов. Расщепление классов.

Dmitriy Pisarenko edited this page Sep 10, 2023 · 3 revisions

Наследование

Наследование – создание нового класса (понятия) на основе старого.

В C ++ есть несколько типов наследования:

  • публичный (public) — публичные (public) и защищенные (protected) данные наследуются без изменения уровня доступа к ним;
  • защищенный (protected) — все унаследованные данные становятся защищенными;
  • приватный (private) — все унаследованные данные становятся приватными.

Базовый класс выделяют в следующих случаях:

  1. Общая схема исполнения разных объектов.
  2. В объектах один и тот же набор методов.
  3. Имеются два разных класса с разными методами. Если у методов похожая реализация, то выделяем базовый класс.
  4. У нас имеется два разных класса. Если в дальнейшем они будут участвовать вместе, лучше сделать для них базовый класс уже на этом этапе разработки. Это нужно сделать, чтобы в дальнейшем нам было легко модифицировать программу.

Разбиваем класс в следующих случаях:

  1. Если один объект исполняет разные роли.
  2. Два множества методов используются в разной манере.
  3. Методы между собой никак не связаны.
  4. Одна сущность, но используется в разных частях программы.
  5. На классах возможно множественное наследование.

За счёт наследования мы можем развивать нашу программу.

Построение иерархии классов

Полиморфизм неразрывно связан с наследованием. Формировать иерархию наследования нужно в случаях:
Выделение общей базы:

  1. Если у двух (разных) понятий общая схема использования, мы обязаны объединить общим базовым классом, который определяет эту схему (создает интерфейс).
  2. Разная схема использования, но общий набор методов (или несколько общих методов)
  3. Разные понятия могут иметь разный набор методов, но общую реализацию (частично общую)

Выделенное понятие должно выполнять только одну роль.

Если на одну роль возлагают несколько ответственностей, то надо расщеплять класс.

Для данной роли необходимо использовать только ограниченный набор методов (использовать их в определённой манере).

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

В C ++ конструкторы и деструкторы не наследуются. Однако они вызываются, когда дочерний класс инициализирует свой объект. Конструкторы вызываются один за другим иерархически, начиная с базового класса и заканчивая последним производным классом. Деструкторы вызываются в обратном порядке. Иерархия классов определяет взаимоотношения между ними. Т.е. при ее построении мы описываем само наследование, указывая есть ли расширение функционала, взаимосвязь не прямо наследуемых классов и т.п. В конечном итоге у нас получается общая структура всех классов.

Clone this wiki locally