Управління доступом до членів базового класу
Статус доступу членів базового класу в похідному класі визначається специфікатором доступу, що використовується для наслідування базового класу. Специфікатор доступу базового класу виражається одним з ключових слів: private, public чи protected.
Якщо специфікатор доступу не вказаний, то за замовчуванням використовується специфікатор private.
Якщо базовий клас наслідується як public-клас, всі його public-члени стають public-членами похідного класу, а його protected-члени - protected-членами похідного класу.
Якщо базовий клас наслідується з використанням специфікатора protected, його public- та protected члени стають protected членами похідного класу.
Якщо ж базовий клас наслідується з використанням ключового слова private, його public- та protected члени стають private-членами похідного класу.
В усіх випадках private-члени базового класу залишаються закритими в рамках цього класу й не є доступними для членів похідного класу.
Розглянемо на простому прикладі як статус доступу впливає на роботу з даними базового класу.
// демонстрація public-наслідування. #include <iostream> #include <conio.h> using namespace std; // оголошення базового класу class B { private: int i, j; public: void set(int a, int b) { i=a; j=b; } void show() { cout<<i<<” ”<<j<<”\n”; } }; // оголошення похідного класу class D : public B { private: int k; public: D(int x) { k=x; } void showk() { cout<<k<<”\n”; } }; int main() { D obj(3); obj.i=10; // Помилка! Член i закритий в рамках класу В obj.set(1,2); // Отримуємо доступ до членів базового класу obj.show(); // Отримуємо доступ до членів базового класу obj.showk(); // Використовується член похідного класу getch(); return 0; } |
Оскільки функції set() та show() є відкритими (public) членами класу В, їх можна викликати для об’єкта obj типу D з функції main(). Але оскільки змінні i та j визначені як private-члени, вони залишаються закритими в рамках свого класу В. Клас D не може отримати доступ до закритого члену класу В. Звідси маємо помилку при зверненні до змінної i.
Протилежністю до відкритого (public) наслідування є закрите (private).
// демонстрація закритого способу наслідування. #include <iostream> #include <conio.h> using namespace std; // оголошення базового класу class B { private: int i, j; public: void set(int a, int b) { i=a; j=b; } void show() { cout<<i<<" "<<j<<”\n”; } }; // оголошення похідного класу // клас В наслідується закритим способом class D : private B { private: int k; public: D(int x) { k=x; } void showk() { cout<<k<<”\n”; } }; int main() { D obj(3); // тепер функції set() та show() недоступні для частин програми поза класом D obj.set(1,2); // Помилка! Доступ до функції set() неможливий obj.show(); // Помилка! Доступ до функції show() неможливий obj.showk(); // Використовується член похідного класу getch(); return 0; } |
Отже, якщо базовий клас наслідується як private-клас, його відкриті члени стають закритими (private) членами похідного класу. Це означає, що вони доступні для членів похідного класу, але не доступні для інших частин програми.
