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

Int mainO

{

derived ObjD(3);

// Помилка, доступу до функції setBO немає.

ObjD.setB(1,2);

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

ObjD.showB("Ba30BHÜ клас:"); cout« endl;

// Доступ до члена класу derived ObjD.showF("Ba30BHÜ клас:", "Похідний клас:");

getchO; return 0;

_}

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

Це означає, що вони доступні для функцій-членів похідного класу, але не дос­тупні для інших частин програми.

  1. Механізми використання захищених членів класу

Член класу може бути оголошений не тільки відкритим (public) або закритим (private), але і захищеним (protected). Окрім цього, базовий клас у цілому може ус­падковуватися з використанням специфікатора доступу protected. Ключове слово protected додане мові програмування C++ для надання механізму успадкування бі­льшої гнучкості.

го класу. Доступ до захищеного члена є ідентичним механізму доступу до закри­того члена, тобто до нього можуть звертатися тільки інші члени того ж самого класу. Механізм успадкування захищеного члена класу істотно відрізняється від закритого члена класу.

  1. Використання специфікатора доступу protected для надання членам класу статусу захищеності

Як уже зазначалося вище, закриті члени базового класу не доступні ніяким іншим частинам програми, окрім функцій-членів свого класу, в т.ч. йдеться і про похідні класи. Проте із захищеними членами класу все відбувається інакше. Якщо базовий клас успадковується як риЬІіс-клас, то захищені члени базового класу ста­ють захищеними членами похідного класу, тобто доступними для нього. Отже, використовуючи специфікатор доступу protected, можна створити члени класу, які закриті у межах свого класу, але можуть успадковуватися похідним класом з от­риманням доступу до себе. Для розуміння сказаного розглянемо такий приклад програми.

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

#include <vcl>

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

#include <conio> // Для консольного режиму роботи

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

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

int с, d; // Ці члени закриті у класі baseClass але доступні для класу derived, public:

void setB(int a, int b) {c = a; d = b;}

void showB(char *s) {cout« s «"c=" « c «d=" « d « endl;}

};

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

intf;

public:

// Клас derived мас доступ до членів класу baseClass с та d.

void setFO {f = c*d;}

void showF(char*b, char*p) {showB(b); cout« p «"f=" «f« endl;}

};

int mainO

{

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

// OK, класу derived це робити дозволено.

0bjD.setB(2, 3);

// ОК, класу derived це робити дозволено.

ObjD.showB("Ba30BHÜ клас:"); cout« endl;

// Функція setF() належить класу derived.

ObjD.setFO;

// Функція showFO належить класу derived.

ObjD.showF("Ba30BHÜ клас:", "Похідний клас:"); getchO; return 0;

}

Внаслідок виконання ця програма відображає на екрані такі результати: Базовий клас: с= 2; d= З

Базовий клас: с= 2; d= З Похідний клас: f= 6

Оскільки клас baseClass успадкований класом derived відкритим способом (тоб­то як риЬІіс-клас), а члени-даних с та d оголошені захищеними у класі baseClass, то функція setFO (член класу derived) може отримувати до них доступ. Якби члени-да- них с та d були оголошені у класі baseClass закритими, то клас derived не міг би зве­ртатися до них і ця програма не скомпілювалася б.

Нео! хідноапам ятати'.аСпецифікатор доступу protected дає змогу створи­ти член класу, який буде доступним у рамках даної ієрархії класів, але є зак­ритим для решти елементів програми.

Якщо деякий похідний клас використовується як базовий для іншого похід­ного класу, то будь-який захищений член початкового базового класу, який успад­ковується (відкритим способом) першим похідним класом, може успадковуватися ще раз (як захищений член) другим похідним класом. Наприклад, у наступній (ці­лком коректній) програмі клас derivedB має повноправний доступ до членів-даних с та d початкового базового класу.

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

#include <vcl>

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

#include <conio> // Для консольного режиму роботи

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

class baseClass { // Оголошення базового класу protected: int с, d; public:

void setB(int a, int b) {c = a; d = b;}

void showB(char *s) {cout« s «"c=" « c «d=" « d « endl;}

};

// Члени c та d успадковуються як protected-члени, class derivedA: public baseClass { int f;

public:

void setFO {f = c*d;} // Правомірний доступ

void showF(char*b, char*p) {showB(b); cout« p «"f=" «f« endl;}

};

// Члени c та d успадковуються опосередковано через клас derivedA. class derivedB : public derivedA{ int h; public:

void setMO {h = c + d;} // Правомірний доступ void showM(char*b, char*p1, char*p2)

{showF(b, p1); cout« p2 «"h=" « h « endl;}

};