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

15.3.2. Використання специфікатора protected для успадкування базового класу

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

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

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

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

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

int izm;

protected:

int jzm;

public:

int kzm;

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

int getIzm() { return izm;}

};

// Успадковуємо клас baseClass як protected-клас.

class derived : protected baseClass {

public:

void setJzm(int a) { jzm = а;} // jzm -- тут protected-член

void setKzm(int a) { kzm = а;} // kzm -- тут protected-член

int getJzm() { return jzm;}

int getKzm() { return kzm;}

};

int main()

{

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

/* Наступний рядок неправомірний, оскільки функція setIzm() є

protected-членом класу derived, що робить його недоступним

за його межами. */

D_ob.setIzm(10);

cout << D_ob.getIzm(); // Неправильно, оскільки функція

// getIzm() -- protected-член.

D_ob.kzm = 10; // Неправильно, оскільки змінна kzm - protected-член

// Наступні настанови правомірні.

D_ob.setKzm(10);

cout << D_ob.getKzm() << " ";

D_ob.setJzm(12);

cout << D_ob.getJzm() << " ";

getch(); return 0;

}

Як зазначено у коментарях до цієї програми, члени (класу baseClass) kzm, jzm, setIzm() і getIzm() стають protected-членами класу derived. Це означає, що до них не можна отримати доступу з коду програми, "прописаного" поза класом derived. Тому посилання на ці члени у функції main() (через об'єкт D_ob) неправомірні.

15.3.3. Узагальнення інформації про використання специфікаторів public, protected і private

Оскільки права доступу, що визначаються специфікаторами public, protected і private, є принциповими для створення програм мовою C++, то є сенс узагальнити все те, що було сказано про ці ключові слова.

Оголошення членів класу:

  • у випадку оголошення члена класу відкритим (з використанням ключового слова public), то до нього можна отримати доступ з будь-якої іншої частини програми;

  • якщо член класу оголошується закритим (за допомогою специфікатора private), то до нього можуть отримувати доступ тільки члени того ж самого класу. Понад це, до закритих членів базового класу не мають доступу навіть похідні класи;

  • якщо член класу оголошується захищеним (тобто protected-членом), то до нього можуть отримувати доступ тільки члени того ж самого класу або похідних від нього. Специфікатор доступу protected дає змогу успадковувати члени, але залишає їх закритими у межах ієрархії класів.

Успадкування базових класів:

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

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

  • якщо базовий клас успадковується з використанням специфікатора protected, то його public- і protected-члени стають protected-членами похідного класу;

  • в усіх випадках private-члени базового класу залишаються закритими у межах цього класу і не успадковуються.

У міру збільшення досвіду створення програм мовою C++ застосування специфікаторів public, protected і private не завдаватиме Вам клопоту. А поки що, коли ще не вистачає упевненості у правильності використання того або іншого специфікатора доступу, спробуйте написати просту експериментальну програму і проаналізуйте отримані результати.