C++. Застосування модифікаторів доступу private, protected, public при успадкуванні класів




Застосування модифікаторів доступу private, protected, public при успадкуванні класів

Перед вивченням даної теми рекомендується ознайомитись з наступною темою:


Зміст


Пошук на інших ресурсах:

1. Особливості застосування модифікаторів доступу при успадкуванні класів

У мові C++ модифікатори доступу private, protected, public можуть застосовуватись до базових класів при їх успадкуванні похідними класами. Дія того чи іншого модифікатора впливає на рівень доступності елементів базових класів і проявляється у двох випадках:

  • коли класи утворюють ієрархію успадкування;
  • коли створюються екземпляри успадкованих класів.

Загальна форма задавання рівня доступу до базового класу наступна:

class DerivedClass : [access_modifier] BaseClass
{
  // ...
};

тут

  • BaseClass – базовий клас;
  • DerivedClass – похідний клас;
  • access_modifier – один з модифікаторів доступу private, protected, public. Модифікатор доступу може бути відсутній, у цьому випадку за замовчуванням приймається private-доступ.

 

2. Модифікатор доступу private для базового класу
2.1. Обмеження доступу для успадкованих класів

Якщо клас B є похідним від базового класу A і базовий клас A містить модифікатор доступу private, то діють наступні правила видимості:

  • усі private-елементи класу A є недоступні в класі B;
  • усі protected-елементи класу A є видимі в класі B;
  • усі public-елементи класу A є видимі в класі B;
  • усі класи, що є успадкованими від класу B не будуть мати доступ до елементів класу A (рисунок 1).

 

С++. Модифікатор доступу private для класу. Обмеження доступу для класу в ієрархії класів

Рисунок 1. Модифікатор доступу private для класу. Обмеження доступу для класу C в ієрархії класів

Як видно з рисунку 1 з класу B можна доступитись до protected та public елементів класу A. Однак для класу C клас A є повністю закритим (обмеження модифікатора private). Якщо з класу C будуть успадковані інші класи (D, E і т.д.), то клас A для цих класів також буде закритим.

 

2.2. Обмеження доступу для екземплярів (об’єктів) успадкованих класів

Якщо класи A, B утворюють ієрархію успадкування і клас A є базовим для класу B, то діють наступні правила стосовно екземплярів цих класів:

  • з екземпляру класу A є доступними тільки public-елементи (члени даних, методи);
  • з екземпляру класу B не є доступними будь-які елементи класу A. Тут спрацьовує обмеження модифікатора private перед іменем класу A (рисунок 2).

 

С++. Модифікатор доступу private для класу. Немає доступу до елементу базового класу з екземпляру похідного класу

Рисунок 2. Модифікатор доступу private для класу. Немає доступу до елементу базового класу A з екземпляру похідного класу B

Як видно з рисунку 2, будь-які елементи private-базового класу A є закритими для екземплярів успадкованого класу B.

 

3. Модифікатор доступу protected

Модифікатор доступу protected обмежує доступ з екземплярів успадкованих класів та не обмежує доступ з методів успадкованих класів. Якщо два класи A, B утворюють ієрархію успадкування, і клас A оголошено базовим з модифікатором protected, то діють наступні правила:

  • усі protected– та public-елементи класу A є доступними з методів класу B (рисунок 3);
  • усі protected– та public-елементи класу A є доступними з методів класу, що успадкований від класу B (класу C);
  • немає доступу до будь-якого елементу класу A з екземплярів похідних класів (рисунок 4).

 

С++. Модифікатор protected для класу. Елементи базового класу, які оголошені як protected або public, є доступні з методів успадкованого класу

Рисунок 3. Модифікатор protected для класу. Елементи базового класу, які оголошені як protected або public, є доступні з методів успадкованого класу

 

С++. Модифікатор доступу protected для класу. Немає доступу до членів базового класу з екземплярів будь-яких успадкованих класів

Рисунок 4. Модифікатор доступу protected для класу. Немає доступу до членів базового класу A з екземплярів будь-яких успадкованих класів (B, C, D, і т.д.)

Як видно з рисунку 4, члени класу A є закритими для екземплярів похідних класів B та C.

 

4. Модифікатор доступу public

Якщо в імені базового класу використовується модифікатор доступу public, то діють наступні правила:

  • protected та public-члени базового класу доступні з методів успадкованого класу;
  • private-члени базового класу недоступні з методів успадкованого класу;
  • public-члени базового класу доступні з екземплярів успадкованого класу;
  • private та protected-члени базового класу недоступні з екземплярів успадкованого класу.

Рисунок 5 демонструє вищевказані правила.

C++. Модифікатор доступу public для успадкованого класу

Рисунок 5. Модифікатор доступу public для успадкованого класу

 


Зв’язані теми