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

Int mainO

{

derivedA ObjA; // Створення об'єкта класу derivedB ObjB; // Створення об'єкта класу

ObjA.setB(2, 3);

ОЬІА.зІіошВ("Базовий клас:"); cout« endl;

ObjA.setFO;

ОЬІА.зІіошР("Базовий клас:", "Похідний клас:"); cout« endl;

ObjB.setB(3,4);

ObjB.showB("Ba30Bnft клас:"); cout« endl;

ObjB.setFO;

ObjB.setMO;

ObjB.showF("Базовий клас:", "Похідний клас 1:"); cout« endl;

ОЬІВ.зІіошМ("Базовий клас:", "Похідний клас 1:", "Похідний клас 2:");

getchO; return 0;

}

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

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

Базовий клас: с= 3; d= 4 Базовий клас: с= 3; d= 4 Похідний клас 1: f= 12

Базовий клас: с= 3; d= 4 Похідний клас 1: f= 12 Похідний клас 2: h= 7

Якщо базовий клас успадковується як закритий (тобто з використанням спе­цифікатора доступу private), то захищені (derived) члени базового класу стають зак­ритими (private) членами похідного класу. Отже, якби у наведеному вище прикладі клас baseClass успадковувався закритим способом, то всі його захищені члени ста­ли б private-членами класу derivedA, і у цьому випадку вони не були б доступні для класу derivedB1. Цю ситуацію продемонстровано у наведеному нижче коді програ­ми, яка через це є некоректною і не відкомпілюється. Всі помилки відзначені у ко­ментарях.

Код програми 5.6. Демонстрація некоректного використання закритих членів #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;}

};

// Елементи класу baseClass будуть закриті у межах класу derivedA. class derivedA: private baseClass { int f; public:

// Виклики цих функцій цілком законні, оскільки змінні с та d // є одночасно private-членами класу derivedA. void setF() {f = c*d;}// OK void showF(char*b, char*p)

{showB(b); cout« p «"f=" «f« endl;}

};

// Доступ до членів c, d, setBO і showBO не успадковується, class derivedB : public derivedA { int h; public:

// Неправильно, оскільки члени-даних c та d закриті у межах класу derivedA. void setM() {h = c + d;}//Помилка void showM(char*b, char*p1, char*p2)

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

};

Int mainO

{

derivedA ObjA; // Створення об'єкта класу derivedB ObjB; // Створення об'єкта класу

// Помилка: не можна викликати функцію setBO ObjA.setB(1,2);

// Помилка: не можна викликати функцію showB()

ObjA.showB("Ba30BHii клас:"); cout« endl;

// Помилка: не можна викликати функцію setBO ObjB.setB(3,4);

// Помилка: не можна викликати функцію showB()

ObjB.showB("Ba30Bnii клас:");

getchO; return 0;

}

Незважаючи на те, що клас baseClass успадковується класом derivedA закритим способом, однак клас derivedA має доступ до public- і protected-членів класу baseClass. Однак цей привілей він не може передати далі, тобто вниз за ієрархією класів. Ключове слово protected - це частина мови C++. Воно забезпечує захист певних елементів класу від модифікації функціями, які не є членами цього класу, але дає змогу передавати їх "зауспадкуванням".

Специфікатор доступу protected можна також використовувати стосовно структур. Але його не можна застосовувати до об'єднань, оскільки об'єднання не успадковується іншим класом. Деякі компілятори допускають використання спе­цифікатора доступу protected в оголошенні об'єднання, але, оскільки об'єднання не можуть брати участь в успадкуванні, то у цьому контексті ключове слово protected буде рівносильним ключовому слову private.

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

class ім'я_класу { private-члени

protected:

protected-члени

public:

риЬІіс-члени

};

Нагадаємо, що розділ захищених членів є необов'язковим.

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

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

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

#include <vcl> #include <iostream> #include <conio> using namespace std;

доступу protected для успадкування базового класу

// Для потокового введення-виведення // Для консольного режиму роботи // Використання стандартного простору імен

class baseClass { // Оголошення базового класу int с; // Закритий protected: