- •2.1 Елементи концепції ооп .. 20
- •1.1 Коментарі.
- •1.2 Прототипи функцій.
- •1.3 Операція розширення області видимості.
- •1.4 Оголошення в операторах.
- •1.5 Перегрузка функцій.
- •1.6 Значення формальних параметрів по замовчуванню.
- •1.7 Посилання та вказівники.
- •1.8 Специфікатор inline
- •1.9 Операції new та delete .
- •1.10 Вказівник на void.
- •1.11 Зв’язування із збереженням типів
- •1.12 Про структури та об’єднання.
- •2.1 Елементи концепції ооп.
- •2.3 Опис протоколу класу.
- •2.4 Передача повідомлень об’єктам.
- •3 Функції-члени.
- •3.1 Функції-члени в межах та за межами формального опису класу.
- •3.2 Про вказівник this.
- •3.3 Перевантаження функцій-членів. Параметри по замовчуванню.
- •4. Конструктори та деструктори.
- •4.1 Поняття про конструктори.
- •4.2 Деструктори.
- •4.3 Досягнення високої ефективності. Конструктор копіювання.
- •5 Глобальні та локальні об’єкти.
- •6 Статична пам’ять та класи.
- •7. Наслідування
- •7.1 Синтаксична реалізація наслідування
- •7.2 Правила доступу до полів даних
- •7.3 Конструктори та деструктори в похідних класах
- •7.4 Використання заміщуючих функцій-членів.
- •7.5 Похідні класи та вказівники.
- •7.6 Ієрархія типів
- •7.7 Множинне наслідування
- •8 Вiртуальнi функцiї та класи
- •8.1 Віртуальні функції.
- •8.2 Чисті віртуальні функції. Абстрактні класи.
- •8.3 Віртуальні деструктори.
- •8.4 Посилання як засіб для реалізації поліморфізму
- •8.5 Технічна реалізація механізму віртуальних функцій.
- •8.6 Віртуальні базові класи
- •8.6.1 Ієрархії класів та наслідування
- •8.6.2 Віртуальні базові класи
- •8.6.3 Виклик конструкторів та віртуальні базові класи.
- •9 Друзі
- •9.1 Дружні класи.
- •9.2 Дружні функції.
- •10 Перевантаження операторiв.
- •10.1 Перевантаження операторів. Загальний підхід.
- •10.2 Перетворення типів.
- •10.3 Перевантаження деяких операторів.
- •10.3.1 Оператор індексування масиву.
- •10.3.2 Перевантаження оператора виклику функції.
- •10.3.3 Оператор доступу до члена класу.
- •10.3.4 Перевантаження операторів інкремента та декремента.
- •10.3.5 Перевантаження операторів управління пам’яттю (new,delete).
- •10.3.6 Перевантаження оператора присвоювання.
- •11.1 Функціональні шаблони
- •11.1.1 Визначення та використання шаблонів функцiй.
- •11.1.2 Перевантаження шаблонiв функцiї.
- •11.1.3 Cпецiалiзованi функцiї шаблона.
- •11.2 Шаблони класів.
- •11.2.1 Визначення шаблонів класу
- •11.2.2 Константи та типи як параметри шаблону
- •11.2.3 Використання шаблонних класів
- •11.2.4 Спецiалiзацiя шаблонiв класу.
- •11.3 Шаблони та конфiгурацiя компiлятора.
- •11.3.1 Шаблони Smart.
- •11.3.2 Шаблони Global I External.
- •12.2 Переадресація вводу-виводу
- •12.3 Розширення потоків для типів кориcтувача
- •12.4 Операції роботи з потоком як дружні
- •12.5 Форматований ввід-вивід
- •12.5.1 Ширина поля
- •12.5.2 Заповнюючий символ
- •12.5.3 Число цифр дійсних чисел
- •12.5.4 Прапорці форматування
- •12.5.5 Маніпулятори
- •12.6 Стан потоку
- •12.7 Файловий ввід-вивід
- •12.7.1 Конструктори файлових потокiв
- •12.7.2 Вiдкриття файлу
- •12.8 Неформатований ввід-вивід
- •12.9 Деякі функції вводу-виводу
- •12.10 Форматування в пам’яті
- •13 Управління виключеннями
- •13.1 Виключення та стек
- •13.2.1 Синтаксис основних конструкцій
- •13.2.1.1 Використання try та сatch
- •13.2.1.2 Використання throw
- •13.2.2 Тип виключення та конструктор копії
- •13.2.3 Пошук відповідного типу виключення
- •13.2.4 Використання terminate() та некеровані виключення
- •13.2.5 Робота з специфікаціями виключень
- •13.2.6 Робота з непередбаченими виключеннями
- •13.2.7 Робота з конструкторами та виключеннями
- •13.2.8 Динамічні об’єкти
- •13.2.9 Передача значень з конструктора та деструктора
- •13.2.10 Робота з ієрархіями виключень
- •13.2.11 Робота з специфічними класами виключень
- •13.3 Структурне управління виключеннями
- •13.3.1 Використання кадрованого управління виключеннями
- •13.3.1.1 Синтаксис
- •13.3.1.2 Про функцію RaiseException()
- •13.3.1.3 Фільтруючий вираз
- •13.3.1.4 Перехоплення виключення процесора
- •13.3.2 Використання завершуючих обробників виключень
7.2 Правила доступу до полів даних
Сформулюємо правила доступу до полів даних та функцій-членів.
Загальні правила доступу.
1. Члени відкритого базового класу в похідному класі зберігають свою спеціфікацію доступу.
2. Відкриті члени захищеного базового класу стають захищеними в похідному класі. Закриті та захищені члени зберігають свої попередні спеціфікації доступу.
3. Всі члени закритого базового класу стають закритими в похідному класі незалежно від попередньої специфікації доступу.
Якщо специфікатор доступу опущений то вважається, що базовий клас є захищеним.
Детальні правила доступу.
Закрита частина класів.
1. Доступ в протоколі.
В протоколі класу є вільний доступ до всіх компонент цього протоколу; тобто будь-яка функція-член в будь-якому розділі опису класу має вільний доступ до будь-яких компонент протоколу класу.
2. Доступ через протокол похідного класу.
Незважаючи на те, що похідні класи наслідують всі протоколи від базових класів, похідний клас не має прямого доступу до полів даних та функцій-членів, описаних в закритому розділі базового класу. В наведеній вище схемі класи PublicPohid PrivatePohid та ProtectedPohid наслідують data1 та function1 з базового класу, але не мають прямого доступу до них навіть у протоколі. Доступ можна забезпечити через функцію, визначену в захищеній чи відкритій частинах класу Base.
3. Доступ через об’єкти(екземпляри класу). Об’єкт не має прямого доступу до своїх власних елементів. Для цього використовуються функції відкритого розділу.
4. Доступ через об’єкти public-похідного класу.
Очевидно, що екземпляри public-похідного класу не мають прямого доступу до закритої частини свого та базового класу. Якщо в класі Base визначені відкриті функції для доступу до закритих полів, то вони наслідуються public-похідними класами і можуть використовуватись об’єктами похідних класів для доступу до них.
5. Доступ через об’єкти private-похідного класу.
З загальних правил випливає, що прямого доступу немає. Навіть якщо описати функцію у відкритій частині базового класу, вона стає закритою в похідному. Проте і в цьому випадку є варіанти виходу.
a. Описати функцію для доступу до закритих даних у відкритій частині класу Base (нехай вона називається access);
b. Описати у відкритому розділі класу PrivatePohid ще одну функцію, яка вказує компілятору на можливість доступу до функції access за допомогою операції розширення області видимості (назвемо її privatefunc()):
returntype privatefunc(type aValue)
{Base::access(aValue);
}
Тоді можливий прямий доступ:
PrivatePohid a;
a.privatefunc(newValue);
Захищена частина класів.
Захищена частина класу - це дещо середнє між відкритою та закритою. Подібно до закритих членів, захищені члени доступні лише функціям-членам відкритого розділу класу. Екземпляр класу немає прямого доступу до своїх захищених даних.
Подібно до відкритих членів захищені члени наслідуються похідними класами і доступні в їх протоколах. Екземпляри похідних класів доступу до захищених даних базового класу, очевидно, не мають. В прикладі протоколи класів PublicDerived, PrivatePohid та ProtectedPohid мають прямий доступ до data2 та function2. В той же час об’єкти aPriv та aPub не мають прямого доступу до data2 , function2 та своїх закритих та захищених розділів.
Відкрита частина класів.
Протокол будь-якого похідного класу має прямий доступ до відкритої частини його базового класу. Всі екземпляри базового класу мають доступ до своєї відкритої частини.
Розглянемо ще кілька простих прикладів.
class Tbase{
protected: int x;
public: int y;
// . . . };
class Tderived: private Tbase {
public:
void f(void)
{ x=3;
// . . .}
// . . .};
В тілі функції f маємо прямий доступ до змінних x та y , але, оскільки Tbase є закритим базовим класом, статус цих змінних змінився на private. Нехай визначений ще один клас:
class Tdec:public Tderived {
public:
void g(void);
// . . .
}
Тут вже функція g() немає доступу до змінних x та y .
Припустимо, що оголошуючи клас B private-похідним від А, хочемо залишити відкритими лише окремі члени класу А. В такому випадку можна використати операцію розширення області видимості:
class B: private A
{// . . .
public:
A:: display();
};
Тоді функція display() буде мати відкритий статус в класі В (так, ніби вона визначена у відкритому розділі класу В).