
Лабораторна робота № 3
Тема: Статичний та динамічний поліморфізм. Раннє та пізнє зв’язування. Віртуальні функції-елементи.
Контрольні запитання:
Статичне зв’язування.
Динамічне зв’язування.
Віртуальні функції. Який тип зв’язування забезпечують віртуальні функції?
Правила створення віртуальних методів.
У яких випадках необхідні віртуальні функції?
Чи можуть бути конструктори віртуальними? Деструктори?
Таблиця віртуальних функцій. Побудуйте таблицю віртуальних функцій для завдання 1.
Що буде виведено на екран в результаті роботи програми. Відповідь обґрунтуйте.
#include <iostream>
using namespace std;
class Base
{
protected:
int baseVar;
public:
Base(int val = 2)
{ baseVar = val; }
int getVar()
{ return baseVar; }
};
class Derived : public Base
{
private:
int derivedVar;
public:
Derived(int val = 100)
{ derivedVar = val; }
int getVar()
{ return derivedVar; }
};
int main()
{
Base *optr;
Derived object;
optr = &object;
cout << optr->getVar() << endl;
return 0;
Завдання 1.
Удосконалити ієрархію класів завдання 1 Лаб роб 1(кораблі), використовуючи віртуальні функції-елементи. Створити масив вказівників на базовий клас(Ship), які проініціалізувати адресами динамічно створених об’єктів класів Ship, CruiseShip, CargoShip. Викликати функці-елементи друку(print()) для створених об’єктів. Результат пояснити.
Завдання 2.
Створити базовий клас Точка. Клас Точка повинен містити методи переміщення на площині. Створити класи плоских геометричних фігур Квадрат, Прямокутник, Трикутник. Ромб. Продумати ієрархію класів. Створити масив фігур(масив вказівників на базовий клас). Продемонструвати роботу системи класів.
Побудувати таблиці віртуальних функцій для створених класів.
Лабораторна робота № 4
Тема: Чисті віртуальні функції. Абстрактний базовий клас. Чистий віртуальний деструктор.
Контрольні запитання:
Яку функцію називають чистою віртуальною?
Різниця між віртуальними та чистими віртуальними функціями.
Який клас називають абстрактним? Особливості використання абстрактного класу.
Чи можна створити екземпляр абстрактного класу? Вказівник на абстрактний клас? Посилання на абстрактний клас?
Чи вірним є твердження, що всі функції в абстрактному базовому класі повинні бути оголошені як чисті віртуальні?
Мета створення абстрактних класів.
Віртуальні деструктори.
Коли необхідно використовувати віртуальні деструктори?
Поняття простору імен.
Створення простору імен. Використання простору імен.
Завдання 1.
Виконати наступні зміни у ієрархії класів завдання 1 Лаб роб 3(кораблі):
поля класів зробити динамічними (char*, int *);
базовий клас Ship оголосити абстрактним;
визначити віртуальні деструктори
*визначити конструктори копії та оператори = для класів ієрархії.
Зауваження:
Конструктор копії похідного класу повинен у списку ініціалізації викликати конструктор копії базового класу: Derived(const Derived & obj): Base(obj){…}. Оператор = похідного класу повинен викликати оператор = базового класу для присвоєння полів, що успадковуються( Base:: operator=(obj)).
Створити масив вказівників на базовий клас(Ship), які проініціалізувати адресами динамічно створених об’єктів класів CruiseShip, CargoShip. Викликати функції-елементи друку(print()) для створених об’єктів. Видалити створені динамічно об’єкти та пояснити роботу деструкторів.
Перевірити неможливість створення екземпляра класу Ship. Пояснити доцільність використання віртуальних деструкторів.
Завдання 2.
Створити абстрактний базовий клас Shape, що містить:
чисті віртуальні функції print(), printShapeName() – без реалізації
віртуальні функції аrea(),volume(), що повертають нульове значення.
Клас Point успадковує реалізації аrea(),volume() від класу Shape(точка має нульову площу та об’єм). Клас Circle успадковує від класу Point реалізацію volume(), але має власну реалізацію аrea(). Клас Cylinder має власні реалізації функцій аrea() та volume().
Створити масив фігур(масив вказівників на базовий клас). Продемонструвати роботу системи класів.