Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

15.2. Керування доступом до членів базового класу

Якщо один клас успадковує інший, то члени базового класу стають членами похідного. Статус доступу до членів базового класу у похідному класі визначається специфікатором доступу, що використовують для успадкування базового класу. Специфікатор доступу базового класу виражається одним з ключових слів: public, private або protected. Якщо специфікатор доступу не вказано, то за замовчуванням використовується специфікатор private, коли йдеться про успадкування типу class. Якщо ж успадковується тип struct, то за відсутності безпосередньо заданого специфікатора доступу використовується специфікатор public.

Розглянемо раміфікацію (розгалуження) використання специфікаторів public або private1 (рис. 15.1).

Рис. 15.1. Керування доступом до членів базового класу

Якщо базовий клас успадковується як public-клас, та всі його public-члени стають public-членами похідного класу.

В усіх випадках private-члени базового класу залишаються закритими у межах цього класу і не доступні для членів похідного. Наприклад, у наведеному нижче коді програми public-члени класу baseClass стають public-членами класу derived. Отже, вони будуть доступними і для інших частин програми.

Код програми 15.2. Демонстрація механізму доступу до членів базового класу після їх успадковується як public-клас

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

class baseClass { // Оголошення базового класу

int izm, jzm;

public:

void setBase(int a, int b) { izm = a; jzm = b;}

void showBase() { cout << "izm= " << izm

<< "; jzm= " << jzm << "\n";}

};

// Оголошення похідного класу

class derived : public baseClass {

int kzm;

public:

derived(int x) { kzm = x;}

void showKzm() { cout << "kzm= " << kzm << "\n";}

};

int main()

{

derived D_ob(3);

D_ob.setBase(1, 2); // Доступ до членів класу baseClass

D_ob.showBase(); // Доступ до членів класу baseClass

D_ob.showKzm(); // Доступ до члена класу derived

getch(); return 0;

}

У процесі виконання ця програма відображає на екрані такі результати:

izm= 1; jzm= 2

kzm= 3

Оскільки функції setBase() і showBase() (члени класу baseClass) успадковані класом derived як public-члени, то їх можна викликати для об'єкта типу derived у функції main(). Позаяк члени даних izm та jzm визначені як private-члени, то вони залишаються закритими у межах свого класу baseClass.

Протилежністю відкритому (public) успадкуванню є закрите (private).

Якщо базовий клас успадковується як private-клас, то всі його public-члени стають private-членами похідного класу.

Наприклад, наведений нижче код програми не скомпілюється, оскільки обидві функції setBase() і showBase() тепер стали private-членами класу derived, і тому їх не можна викликати з функції main().

Код програми 15.3. Демонстрація механізму доступу до членів базового класу після їх успадковується як private-клас

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

class baseClass { // Оголошення базового класу

int izm, jzm;

public:

void setBase(int a, int b) { izm = a; jzm = b;}

void showBase()

{ cout << "izm= " << izm << "; jzm= " << jzm << "\n";}

};

// Відкриті члени класу baseClass тепер стають

// Закритими членами класу derived.

class derived : private baseClass {

int kzm;

public:

derived(int x) { kzm = x;}

void showKzm() { cout << "kzm= " << kzm << "\n";}

};

int main()

{

derived D_ob(3);

D_ob.setBase(1, 2); // Помилка, доступу до функції setBase() немає.

D_ob.showBase(); // Помилка, доступу до функції showBase() немає.

getch(); return 0;

}

Варто знати! У випадку, коли базовий клас успадковується як private-клас, то його відкриті члени стають закритими (private) членами похідного класу. Це означає, що вони доступні для членів похідного класу, але не доступні для інших частин програми.