Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_-_Praktichne_zanyattya_16.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
414 Кб
Скачать
☆

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

Статус доступу членів базового класу в похідному класі визначається специфікатором доступу, що використовується для наслідування базового класу. Специфікатор доступу базового класу виражається одним з ключових слів: 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) членами похідного класу. Це означає, що вони доступні для членів похідного класу, але не доступні для інших частин програми.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]