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

  Юрий Ворон  | 

    | 

  Обновлено 6 Сен 2018  | 

 1010

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

Во-первых, начнем с класса 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 (9 оценок, среднее: 4,89 из 5)
Загрузка...

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

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

telegram канал
RAVESLI