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

15.6. Повернення успадкованим членам початкової специфікації доступу

Коли базовий клас успадковується закритим способом (як private-клас), то всі його члени (відкриті, захищені та закриті) стають private-членами похідного класу. Але за певних обставин один або декілька успадкованих членів необхідно повернути до їх початкової специфікації доступу. Наприклад, незважаючи на те, що базовий клас успадковується як private-клас, деяким визначеним його public-членам потрібно надати public-статус у похідному класі. Це можна зробити двома способами:

  • по-перше, у похідному класі можна використовувати оголошення using (цей спосіб рекомендується стандартом мови C++ для використання в новому коді програми). Але особливості використання директиви using відкладемо до розгляду теми простору імен1;

  • по-друге, можна налагодити доступ до успадкованого члена за допомогою оголошень доступу.

Зауважмо, що оголошення доступу все ще підтримуються стандартом мови C++, але останнім часом активізувалися заперечення проти його застосування, а це означає, що його не варто використовувати в новому коді програми. Позаяк воно все ще використовуються у мові програмування С++, то дещо приділимо увагу цій темі.

Оголошення доступу має такий формат:

ім'я_базового_класу::член;

Оголошення доступу відновлює рівень доступу до успадкованого члена, внаслідок чого він отримує той статус, який був у нього в базовому класі.

Оголошення доступу поміщається у похідному класі під відповідним специфікатором доступу. Звернемо Вашу увагу на те, що оголошення типу у цьому випадку вказувати не потрібно. Щоб зрозуміти, як працює оголошення доступу, розглянемо спочатку такий короткий фрагмент коду програми:

class baseClass {

public:

int jzm; // public-доступ у класі baseClass

};

// Клас baseClass успадковується як private-клас.

class derived : private baseClass { // Оголошення похідного класу

public:

// Ось використання оголошення доступу:

baseClass::jzm; // Тепер член jzm знову став відкритим.

//. . .

};

Оскільки клас baseClass успадковується класом derived закритим способом, то його public-змінна jzm стає private-змінною класу derived. Проте внесення цього оголошення доступу

baseClass::jzm;

в класі derived під специфікатором public відновлює public-статус члена jzm.

Оголошення доступу можна використовувати для відновлення прав доступу public- і protected-членів. Проте для зміни (підвищення або пониження) статусу доступу його використовувати не можна. Наприклад, член, оголошений закритим у базовому класі, не можна зробити відкритим у похідному1. Використання оголошення доступу продемонстровано в такій програмі.

Код програми 15.15. Демонстрація механізму використання оголошення доступу

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

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

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

int izm; // private-член у класі baseClass

public:

int jzm, kzm;

void setIzm(int x) { izm = x;}

int getIzm() { return izm;}

};

// Клас baseClass успадковується як private-клас.

class derived : private baseClass {

public:

/* Наступні три настанови перевизначають private-успадкування класу

baseClass і відновлюють public-статус доступу для членів jzm,

setIzm() і getIzm(). */

baseClass::jzm; // Змінна jzm стає знову public-членом

// а змінна kzm залишається закритим членом.

baseClass::setIzm; // Функція setIzm() стає public-членом.

baseClass::getIzm; // Функція getIzm() стає public-членом.

// baseClass::izm; // Неправильно: не можна підвищувати рівень доступу

int a; // public-член

};

int main()

{

derived D_ob; // Створення об'єкта класу

// D_ob.izm = 10; // Неправильно, оскільки член izm

// закритий у класі derived.

D_ob.jzm = 20; // Допустимо, оскільки член jzm став

// Відкритим у класі derived

// D_ob.kzm = 30; // Неправильно, оскільки член kzm

// Закритий у класі derived.

D_ob.a = 40; // Допустимо, оскільки член а відкрито у класі derived.

D_ob.setIzm(10);

cout << D_ob.getIzm() << " " << D_ob.jzm << " " << D_ob.a;

getch(); return 0;

}

Звернемо Вашу увагу на те, як у цій програмі використовуються оголошення доступу для відновлення статусу public у членів jzm, setIzm() і getIzm(). У коментарях відзначені й інші обмеження, пов'язані із статусом доступу.

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