- •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 Використання завершуючих обробників виключень
8.6.3 Виклик конструкторів та віртуальні базові класи.
1. Вiртуальнi базовi класи(ВБК) iнiцiалiзуються (викликається void-конструктор) перед будь-якими не ВБК в тому порядку, в якому вони зустрiчаються в графi наслiдування.
2. Якщо ВБК має хоча б один конструктор , то вiн повинен мати void- конструктор. З похiдного класу не можна прямо викликати не void-конструктор ВБК .
Приклад:
class Animal
{protected :
int weight;
public:
Animal(void)
{cout <<"/n void constructor for
Animal \n";
weight=0;}
Animal (int aWeight)
{cout <<"/n multiple constructor
for Animal \n";
weight=aweight;}
virtual void print(void print(void)
{cout<<"The weight="<<weight<<'\n';}};
class Cow:public virtual Animal
{public:
Cow(void)
{cout<<"\n void constr.for Cow\n";}
Cow(int aWeight)
{cout<<"\n mnltiple constr.for Cow\n";
weight=aWeight;}
void print(void)
{cout<<"The Cow has weight\n";
Animal::print( );
};
};
class Buffalo:public virtual Animal,
{//аналогiчно Cow};
class Beffalo:public Cow,public Buffalo
{public:
Beefalo(int aWeight)
{cout<< " \n multiple constructor for Beefalo\n";
Weight=aWeight;}
void print (void)
{//...аналог функції в класі Cow};
main( )
{cow acow(1400)
Beefalo aBeefalo (700);
Animal & myCom=aCom;
Animal & myBeefalo=aBeefalo;
myCom.print( );
myBeefalo.print( );
}
Надрукується:
1. void constr для Animal
2. mult для Cow
3. void для Animal
4. void для Сow
5. void для Buffalo
6. mult для Beefalo.
Контрольні запитання
1. Що таке віртуальна функція, поліморфічний кластер ?
2. В чому полягає специфіка чистої віртуальної функції ?
3. В чому полягає специфіка абстрактного класу ?
4. Які переваги у використанні абстрактних класів ?
5. Як можна реалізувати концепцію поліморфізму , використовуючи посилання?
6. Коли здійснюється компілятором контроль при передачі параметрів віртуальним функціям ?
7. Як технічно реалізується механізм віртуальних функцій ?
8. Які конфлікти, крім конфліктів імен, виникають при множинному насліду- ванні ?
9. Для чого потрібні і як визначаються віртуальні базові класи ?
10. Як реагує компілятор на оголошення базового класу віртуальним?
11. В чому полягає специфіка віртуальних базових класів по відношенню до виклику конструкторів?
12. Чи можна викликати не void-конструктор віртуального класу в похідному класі ?
Завдання 8:
1. Протестувати клас shape, дописавши відповідні функції draw().
2. Визначити ряд функцій в класі Літак як віртуальні (наприклад , функцію що відповідає за рух літаків та ін.)
3. Описати базовий клас Фрукт , що містить віртуальну функцію, яка видає деяке повідомлення. Описати ряд класів, похідних від нього, що містять віртуальні функції друку повідомлень про назву відповідного фрукта ( яблуко, груша , тощо). Створити однозв’язний список таких “фруктових” об’єктів та надрукувати їх.
4. Написати програму створення абстрактного синтаксичного дерева для аналізу та обчислення алгебраїчних виразів (програма калькулятор).
Наприклад, вираз 5+12*4 може бути представлений так:
+ * 4
_ 12
5
Визначити базовий клас , що задає загальний тип вершини та похідні класи для визначення окремих типів вершин для операторів *,+ , унарного - та цілих значень.
Описати метод eval(), що здійснює відповідні обчислення, як віртуальний.
5. Протестувати приклад з класом Animal (розглянути випадки , коли Animal є віртуальним базовим класом та невіртуальним).
6. Протестувати приклад з класом Animal , видаливши з базового класу void-конструктор.