Урок №168. Приховування методів батьківського класу

  Юрій  | 

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

 47

Мова C++ надає можливість змінити специфікатор доступу батьківського члена в дочірньому класі. Це робиться за допомогою “using-оголошення”. Наприклад, розглянемо наступний клас Parent:

Оскільки Parent::printValue() оголошений як protected, то він доступний тільки іншим членам Parent і своїм дочірнім класам. Для інших об’єктів доступ до нього закритий.

Визначимо клас Child, який змінює специфікатор доступу printValue() з protected на public:

Це означає, що наступний код виконається без помилок:

Тут є дві примітки:

   По-перше, ви можете змінити специфікатори доступу тільки для тих членів батьківського класу, до яких є доступ у дочірнього класу. Ви не зможете змінити специфікатор доступу члена батьківського класу з private на protected або public, оскільки дочірній клас не має доступ до private-членів батьківського класу.

   По-друге, починаючи з C++11 використання “using-оголошення” є кращим способом зміни специфікаторів доступу. Однак ви також можете використовувати “access-оголошення”. Це працює ідентично “using-оголошенню”, тільки без ключового слова using. Зараз цей спосіб вважається застарілим, але, переглядаючи старий код, ви можете побачити “access-оголошення”, тому про це варто знати.

Приховування батьківських методів в дочірньому класі

У мові C++ неможливо видалити або обмежити функціонал батьківського класу, крім як за допомогою безпосередньої зміни вихідного коду. Однак в дочірньому класі ви можете приховати функціонал, який існує в батьківському класі, так щоб до нього не можна було отримати доступ через об’єкти дочірнього класу. Це робиться шляхом зміни відповідних специфікаторів доступу.

Наприклад, ви можете зробити закритим відкритий член батьківського класу:

Це дозволяє інкапсулювати дані батьківського класу в дочірньому класі. В якості альтернативи можна використати спадкування типу private, що призведе до того, що всі успадковані public- і protected-члени класу Parent стануть private в класі Child.

Ви також можете закрити батьківські методи в дочірньому класі, використовуючи ключове слово delete:

Таким чином, компілятор скаржитиметься, якщо ми спробуємо викликати метод getValue() через об’єкт класу Child. Однак через об’єкт батьківського класу все працюватиме, тому що ми «видалили» getValue() тільки в дочірньому класі.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (2 оцінок, середня: 5,00 з 5)
Loading...

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

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