Урок №166. Додання нового функціоналу в дочірній клас

  Юрій  | 

  Оновл. 25 Лют 2021  | 

 38

Однією з найбільших переваг використання дочірніх класів є можливість повторного використання вже написаного коду. Ми можемо наслідувати функціонал батьківського класу, а потім додати свій функціонал/змінити існуючий функціонал/приховати непотрібні частини батьківського функціоналу. На цьому і наступних уроках ми розглянемо, як це все зробити.

По-перше, почнемо з класу Parent:

Тепер створимо дочірній клас, який наслідуватиме клас Parent. Оскільки ми хочемо мати можливість встановити значення m_value при ініціалізації об’єктів дочірнього класу, то зробимо так, щоб конструктор класу Child викликав конкретний конструктор класу Parent в списку ініціалізації:

Додання нового функціоналу в дочірній клас

У прикладі, наведеному вище, оскільки ми маємо доступ до вихідного коду класу 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 Зірок (2 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

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