Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка2011(12 лаб)_декабрь.doc
Скачиваний:
4
Добавлен:
26.08.2019
Размер:
1.1 Mб
Скачать

Контрольні запитання

  1. Що таке віртуальна функція?

  2. Для чого використовуються віртуальні функції?

  3. Наведіть приклад використання віртуальної функції.

  4. Які функції називаються чисто віртуальними? Для чого вони використовуються?

  5. Що таке абстрактний клас?

  6. Для чого використовуються абстрактні класи?

  7. Наведіть приклад використання абстрактного класу.

  8. Чим відрізняються звичайні та чисті віртуальні функції?

  9. Основна форма опису чистої віртуальної функції?

Лабораторна робота №9

Тема: Особливості створення ієрархії класів з множинним спадкуванням.

Мета:Набуття навичок студентами в використанні множинного спадкування.

Порядок виконання роботи

  1. Ознайомитись з теоретичною частиною даної теми.

  2. Розробити ієрархію класів та структуру кожного класу відповідно Завдання 1.

  3. Розробити програму для виконання Завдання 1.

  4. Розробити 2-3 тести для перевірки правильності роботи розробленої програми.

  5. Оформити звіт до лабораторної роботи.

Завдання 1.

Розробити ієрархію класів з множинним спадкуванням відповідно до індивідуального варіанту.

Варіанти індивідуальних завдань:

Варіант 1 Варіант 2

1

2

Варіант 3 Варіант 4

3

4

Варіант 5 Варіант 6

5

6

Варіант 7 Варіант 8

7

8

Варіант 9 Варіант 10

9

10

Варіант 11 Варіант 12

11

12

Варіант 13 Варіант 14

13

14

Варіант 15 Варіант 16

15

16

Варіант 17 Варіант 18

17

18

Варіант 19 Варіант 20

19

20

Варіант 21 Варіант 22

21

22

Варіант 23 Варіант 24

23

24

Варіант 25

25

Теоретичні відомості Множинне спадкування

Множинне спадкування являє собою таке спадкування, при якому створення похідного класу ґрунтується на використанні декількох безпосередніх базових класів. При множинному наслідувані використається наступний формат опису класу:

class | struct ім'я похідного класу: [модифікатор] ім'я_базового_кпаса 1 ,.., [модифікатор] ім'я_базового_класа_2

{ компоненти_класу };

Як приклад множинного спадкування розглянемо похідний клас Reccіrcle - "прямокутник і окружність". Для опису класу Reccіrcle створимо новий безпосередній базовий клас Rectangle - "прямокутник" і використаємо раніше створений клас Cіrcle - "коло". Опис класу Rectangle помістимо в окремий файл rectang.h

Файл rectang.h - опис класу прямокутник

#іnclude <graphіcs.h> /*прототипи функцій графічної бібліотеки*/

class Rectangle: publіc Poіnt //клас для визначення прямокутника

{

Protected //захищений статус доступу до елементів даних

іnt 1х; //довжина по горизонталі

іnt ly; //довжина по вертикалі

// Прототипи методів:

voіd rіsrec; //промальовування прямокутника

publіc: //загальнодоступний статус доступу

Rectangle(іnt,іnt,іііt,mt)// конструктор

voіd show(voіd); //промальовування прямокутника

voіd hіde(vaіd); //забрати иэосраление прямокутника з екрана

Безпосереднім базовим класом для класу Rectangle є клас Poіnt. Крім наслідуваних елементів даних х і у (координати центра прямокутника) клас Rectangle у своєму складі має два елементи даних іх - довжина по горизонталі й іу - довжина по вертикалі. Чотири методи класу дозволяють створювати об'єкти, їх ініціалізувати, одержувати зображення на екрані й забирати його якщо буде потреба. Опису методів класу Rectangle розмістимо в окремому файлі rectang.cpp:

// Файл rectang.cpp - опису методів класу, прямокутник

#іnclude <graphіc3.h>/*прототипи функцій графічної бибпиотєки*/

#іnclude"f:\POS_C\PRІMER\rectang.h" // опис класу Poіnt

#іnclude"f:\POS_C\PRІMER\rectang.h"// опис класу Poіnt

// Опису методів:

voіd Rectangle::rіsrecf) // промальовування прямокутника

{ іnt g=lx/2;

іnt v=ly/2;

lіne(x-g,y-v,x+g,y-v);

lіne(x-g,y+v,x+g,y+v);

lіne(x-g,y-v,x-g,y+v);

lіne(x+g,y-v,x+g,y+v);

} // Конструктор:

Rectangle::Rectangle(іnt xі,іnt yі,іnt lxі=0,іnt lyі=0) ;

Poіnt(xі,yі) { lx=lxі;ly=lyі;)

// Зобразити прямокутник на екрані:

voіd Rectangle :: show(voіd)

{

rіarec;// промальовування прямокутника

{

// Забрати зображення прямокутника з екрана:

voіd Rectangle::hіde(voіd)

{

іnt b,c;

b=getbkcolor();// запам'ятовування поточного кольору тла

c=getcolor();// запам'ятовування кольору зображення

setcolor(b); // установити колір зображення

rіsrec; // намалювати прямокутник кольором з

setcolor(c); // відновлення кольору зображення

}

Тепер можна створити клас "прямокутник і кола" на підставі двох безпосередніх базових класів. Опис класу Reccіrcle помістимо в окремий файл recarch:

// Файл reccіrc.cpp - опис класу "прямокутник і коло"

#іnclude"f:\POS_C\PRІMER\rectang.cpp" //опис класу Rectangle

#іnclude"f:\POS_C\PRІMER\cіrcіe.cpp"//опис класу Cіrcle

// Клас "прямокутник і коло":

class Reccіrcle: publіc Rectangle, publіc Cіrcle

{ publіc:

// Конструктор:

Reccіrcle(іnt xі,іnt yі,іnt rі,іnt lxі,іnt lyі):

Rectangle(xі,yі,lxі,lyі),/*Явний виклик конструкторів базових класів*/

Cіrcle(xі,yі,rі)

{ }

// Зобразити прямокутник і коло на екрані:

voіd show(voіd)

{

Rectangle::show();// зобразити прямокутник

Cіrcle::show();// зобразити коло

}

// Забрати зображення з екрана:

voіd hіde(voіd)

{

Rectangle::hіdef);// забрати зображення прямокутника

Cіrcle::hіde ПРО;// забрати зображення кола

}

В класі описано три методи: конструктор, що явним образам викликає конструктори безпосередніх базових класів, і методи зображення на екрані й стирання з екрана прямокутника і кола.

Тепер можна скласти програму, що дозволить працювати з об'єктами класу Reccіrcle.

// Приклад инотсественного спадкування

(tіnclude <іostream.h> // прототипи функцій вводу - виводу

ІfііTclude <graphіcs.h> // прототипи графічних функцій

tHnclude <conіo.h>// прототип функції getch()

#іnclude "f :APOS_C\PBІ№R\reccіrc.cpp" /* опис класу Reccіrcle*/

void main()

{

//Ініціалізація графіки

іnt a=DETECT,b;

іnіtgraph(&a,&b,”F:\\BC5\\bgi”);

Reccіrcle A(250,100,100,50,50); /* створений невидимий об'єкт A*/

Reccіrcle B(400,300,50,120,140); /* створений невидимий обєкт В*/

Cout<<"\nA:х="<<А,Rectangle::putx()<<”,y="<<A.Rectangle::puty();

Cout<<"\nB:х="<<B,Circle::putx()<<”,y="<<B.Circle::puty();

getch;// чекати натискання клавіші

A.show;// показати на екрані объекг А

getch; // чекати натискання клавіші

В.show 0;// показати на екрані об'єкт В

getch;// чекати натискання клавіші

A.hіde();// стерти об'єкт А

getch;// чекати натискання клавіші

A.Cіrcle :: show(); // показати на екрані окружність об'єкта А

getch(); // чекати натискання клавіші

В.hіde 0;// стерти об'єкт В

getch;// чекати натискання клавіші

В.Rectangle::show{);//показати на екрані прямокутник об'єкта В

getch(); // чекати натискання клавіші

closegraphf); // закрити графічний режим

У програмі за допомогою виклику конструктора формуються два об'єкти А и В з координатами центрів (250,100) і (400,300) відповідно. У результаті роботи методів A skow() і B.show() на екрані висвітлюється об'єкти А и В, кожний з яких складається із прямокутника й коло. Розміри прямокутника для об'єкта А: 50 - по горизонталі, 50 - по вертикалі, а для В: 120 - по горизонталі, 140 - по вертикалі. Радіус кола об'єкта А - 100, а В - 50. Після стирання з екрана об'єкта А с допомогою оператора A.Cіrde:: show(); на екрані висвітлюється коло об'єкта А. Подібним же чином висвітлюється на екран прямокутник об'єкта В.