Урок №158. Добавление нового функционала в дочерний класс

  Юрий  | 

  |

  Обновл. 20 Июл 2023  | 

 25998

 ǀ   2 

На уроке №153 мы говорили о том, что одним из самых больших преимуществ использования дочерних классов является возможность повторного использования уже написанного кода. Мы можем наследовать функционал родительского класса, а затем добавить свой функционал/изменить существующий функционал/скрыть ненужные части родительского функционала. На этом и следующих уроках мы подробно рассмотрим, как это всё сделать.

Во-первых, начнем с класса Parent:

Теперь создадим дочерний класс, который будет наследовать класс Parent. Поскольку мы хотим иметь возможность установить значение m_value при инициализации объектов дочернего класса, то сделаем так, чтобы конструктор класса Child вызывал конкретный конструктор класса Parent в списке инициализации (детально об этом мы говорили на уроке №156):

Добавление нового функционала в дочерний класс

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

Есть случаи, когда мы имеем доступ к родительскому классу, но не хотим его изменять. Например, мы только что купили библиотеку кода у стороннего поставщика, но нам нужен дополнительный функционал. Мы можем добавить его в исходный код библиотеки, но это будет не лучшим решением. Что, если придет обновление? После обновления нам заново придется вручную перенести весь код, что займет время и, кроме того, после обновления остается риск, что наш старый код уже не будет работать так, как нужно с кодом библиотеки.

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

В любом случае лучшим решением является написание собственного родительского класса и добавление нужного нам функционала в наши дочерние классы.

Один нюанс с классом Parent заключается в доступе других объектов к m_value. Мы можем это исправить, добавив функцию доступа в класс Parent, но, ради примера, добавим геттер в класс Child. Поскольку m_value объявлен как protected в классе Parent, то Child имеет прямой доступ к нему.

Добавление нового функционала в дочерний класс выполняется как обычно:

Теперь другие объекты извне смогут вызывать getValue() через объект класса Child для доступа к m_value:

Результат:

child has value 7

Это очевидно, что объекты класса Parent не имеют доступ к методу getValue() в Child. Следующее не сработает:

Это связано с тем, что в классе Parent нет метода getValue(). Метод getValue() принадлежит классу Child. А, поскольку Child является дочерним от класса Parent, то Child имеет доступ к членам Parent, а Parent не имеет доступа ни к чему в классе Child.


Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (205 оценок, среднее: 4,93 из 5)
Загрузка...

Комментариев: 2

  1. atutsasha:

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

    1. Евгениальный:

      Ну, это естественно. Дочерний класс — надстройка над родительским, а не наоборот

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *