17124

Використання віртуальних і покажчиків для роботи з об'єктами класів

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторна робота № 33 Тема: Використання віртуальних і покажчиків для роботи з об'єктами класів Ціль роботи: вивчити і навчитися використовувати віртуальні функції в мові С. Обладнання: ПКПО Borland C Теоретичні відомості Віртуальні функціїчлени з'являються в к...

Украинкский

2013-06-29

51.5 KB

1 чел.

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

Тема: Використання віртуальних і покажчиків для роботи з об'єктами класів

Ціль роботи: вивчити і навчитися використовувати віртуальні функції в мові С.

Обладнання: ПК,ПО Borland C++

Теоретичні відомості

Віртуальні функції-члени з'являються в класі c ключовим словом virtual.

Якщо базовий клас (БК) base містить віртуальну функцію (virtual) vf () і похідний клас (ПК) derived також містить цю функцію, то при виклику функції vf() для об'єкта базового класу ми одержимо base:: vf(), а для об'єкта похідного класу ми одержуємо derived::vf(). Наприклад:

Базовий клас

Похідний клас

struct base

{…..

virtual void vf (void);

void f (void);

};

base_1

class

{…

public:

virtual void vf(void)=0

void f(void);

};

struct derived : public base

{…..

virtual void vf (void);

// virtual в останньому

// ПК можна опустити

void f (void);

};

derived d;  // об'єкт производного класу

d.vf(); // виклик функції класу d

// erived::vf()

d.f();  // виклик функції класу

// derived::f()

base* bp = &d;  // покажчик на

// БК адресує об'єкт ПК

bp->vf ();  // виклик віртуальної

// функції derived::vf()

bp->f ();  // виклик функції-члена

// класу base

// base:: f()

Тип об'єктів класів з віртуальними функціями визначається під час виконання програми.

Тому при викликах за допомогою покажчика bp на БК функцій vf() і f() для об'єкта ПК з ім'ям d викликаються, відповідно, derived::vf(), але base::vf(). Виклик потрібної віртуальної функції vf() залежить від типу об'єкта, для якого вона викликається (derived d), у той час як виклик невіртуальної функції f() залежить тільки від типу покажчика (base*bp), що адресує даний об'єкт.

Якщо похідний клас містить функцію з тим же ім'ям, що й ім'я віртуальної функції в базовому класі, то вони повинні мати той самий тип. Функція vf() у ПК від БК, у якому міститься віртуальна функція vf(), також вважається віртуальною. Віртуальна функція може бути визначена в базовому класі. Віртуальну функцію, що уже визначена в базовому класі, у похідному класі можна не визначати. У цьому випадку при використанні покажчика на БК для адресації ПК при всіх звертаннях використовується функція, визначена в базовому класі. Якщо віртуальна функція в класі закінчується нулем (=0), то вона називається чистою віртуальною функцією. Чиста віртуальна функція не має визначення в базовому класі, але визначається в похідних. Клас, що містить хоча б одну таку функцію, називається абстрактним. Не можна створити об'єкт абстрактного класу.

Віртуальні базові класи

При множинному спадкуванні базовий клас не може задаватися в похідному класі більш одного разу. Однак, базовий клас можна передавати похідному  класу більш одного разу побічно:

class B { ... };

class D : B, B { ... }:

// неприпустимо

class X : public B { ... };

class Y : public B { ... };

class Z : public X, public Y { ... };  // припустимо

У даному випадку кожен об'єкт класу Z буде мати два підобъекта класи В. Для усунення цієї проблеми до специфікатора базового класу додають ключове слово virtual. Наприклад:

class X : virtual public B { ... };  // тепер У  є  віртуальним  базової

класом

class Y : virtual public B { ... };

class Z : public X, public Y { ... }  // клас Z має тільки один підобъект класу В.

Віртуальні деструктори

Конструктори не можуть бути віртуальними. Деструктор може бути оголошений як віртуальний (virtual). Це дозволяє покажчику на базовий клас викликати необхідний деструктор у випадку, коли покажчик посилається на об'єкт похідного класу. Деструктор похідного класу від базового класу з віртуальним деструктором є віртуальним.

class color

{...

public:

virtual ~color();  // віртуальний

// деструктор для класу color

};

class red : public color

{...

public:

virtual~red();    // деструктор для red // також є віртуальним

};

class brightred : public red

{...

public:

virtual~brightred();      // деструктор для brightred також віртуальний

};

Розглянемо роботу з об'єктами оголошених класів. Покажчик на базовий клас може адресувати об'єкти похідних класів

Color *palette[3];  // оголошення масиву покажчиків на базовий клас

Palette[0] = new red;  // створення об'єкта класу red у купі

palette[1] = new brightred; // створення об'єкта класу brightred у купі

palette[2] = new color; // створення об'єкта базового класу в купі

Застосування оператора delete

delete palette[0];  // викликається деструктор для об'єкта класу red

delete palette[1];  // деструктор для об'єкта класу brightred

delete palette[2];  // запуск деструктора для об'єкта класу color

Однак, якщо жоден з деструкторів не був оголошений віртуальним, то вираження delete palette[0], delete palette[1] і delete palette[2] викликають тільки деструктор для базового класу color, на який оголошений масив покажчиків. Це приведе до неправильного знищення перших двох елементів, що фактично мали тип red і brightred. Виклики віртуальних деструкторів компонуються під час виконання програми й об'єкти самі визначають, який деструктор треба викликати.

 

Приклад програми на С++

#include<iostream.h>

class palyvo

{public:

virtual int vs()

{s=a-(b+c);

 return s;}

void coutr();

palyvo();

protected:

char*post;

char*pok;

double a,b,c,s;

};

class benzin:public palyvo

{public:

virtual int vs()

{s=a-(b+c);

 return s;}

benzin();

};

class nafta:public benzin

{public:

virtual int vs()

{s=a-(b+c);

 return s;}

nafta();

};

void main()

{palyvo*p[3];

p[0]=new benzin;

p[1]=new nafta;

p[2]=new palyvo;

p[0]->vs();

p[1]->vs();

p[2]->vs();

cout<<"\nbenzin";

p[0]->coutr();

cout<<"\nnafta";

p[1]->coutr();

cout<<"\npalyvo";

p[2]->coutr();

delete p[0],p[1],p[2];

}

void palyvo::coutr()

{cout<<"\nob'em reservnih palyva: "<<s;

cout<<"\nob'em: "<<a;

cout<<"\nob'em sklada: "<<b;

cout<<"\nob'em osnovnogo zapasa palyva: "<<c;

cout<<"\nPostavshiki: "<<post;

cout<<"\nPokupateli: "<<pok;

}

palyvo::palyvo()

{a=10000; b=5000; c=4999;

post="Lukoil";

pok="TNK";

}

benzin::benzin()

{a=5000; b=3000; c=1000;

post="Lukoil";

pok="Gas";

}

nafta::nafta()

{a=78999; b=999;

c=500;

post="GAS";

pok="Gefest";

}

Хід роботи

1.Вивчити теоретичні відомості.

2.Відповідно до індивідуального завдання на базі лабораторної роботи №22 розробити алгоритм роботи з об'єктами базових і похідних класів з використанням покажчиків на базові і похідні класи. 3.При необхідності довести ієрархію класів до 3-4-х рівнів.

4.Набрати програму на комп'ютері й усунути помилки.

5.Одержати результат.

6.Оформити звіт.

7.Підготуватися до захисту лабораторної роботи, вивчивши контрольні питання по даній темі.

Вимоги до змісту звіту приведені в лабораторній   роботі   №1.

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

1.Які функції-члени називаються убудованими (inline)?

2.Які функції-члени називається перевантаженими?

3.Які функції-члени називаються що заміщають?

4.Які функції- члени називається віртуальними?

5.Чи можна адресувати об'єкти ПК за допомогою покажчиків на загальний БК, на попередній БК по ієрархії?

6.Назвіть правила використання покажчиків для роботи з об'єктами БК і ПК.

7.Коли необхідне визначення віртуальної функції в базовому класі?

8.Який клас називається абстрактним?

9.Чи можна створити об'єкт абстрактного класу?

10.Яка функція називається чисто віртуальної?

11.Чи можна установити в процесі компіляції яка функція буде викликатися при використанні покажчиків для роботи з об'єктами?

12.Чи можуть конструктори і деструктори бути віртуальними? Чим це викликано?

13.Як виробляється розміщення об'єктів класів у "купі"?

14.Як виробляється виділення і звільнення пам'яті для динамічно створюваних об'єктів?

15.Коли виробляється перебування віртуальної функції, яку необхідно викликати для заданого об'єкта ПК, якщо для адресації об'єкта ПК використовується покажчик на БК.?

16.Яка невіртуальна функція буде викликана в зазначеному випадку і чому?

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


 

А также другие работы, которые могут Вас заинтересовать

23154. Я хочу правді бути вічним другом і ворогом одвічним злу... творчість Василя Симоненка 27.5 KB
  Це очі Василя Симоненка поета якому судилося прожити усього 28 років але залишитися в пам'яті народній назавжди. Тому мабуть кожне наступне покоління буде вважати Василя Симоненка своїм однолітком і гортаючи сторінки знаходити в поезіях відгуки власних емоцій і почуттів. Найбільша любов поета це рідна земля Україна саме цій темі присвячена більшість творів Симоненка: Україно ти моя молитва ти моя розпука вікова.
23155. Ліна КОСТЕНКО БЕРЕСТЕЧКО 414 KB
  Кишить Вкраїна кишлами орди І Бог згортає чорними сувоями твоє терпіння виткане з біди НЕ ЖАЛІВ МЕНІ ХАН НІ ВИНА НІ КУМИСУ НІ МЕДУ. І розджохався хан усе причіпеньки шукав: Ти мене одурив проклятий ґяуре Я привів своє військо а ти мене ошукав Що ж ти хочеш козацький ти макогоне щоб у тих болотах мені жаба цицьки дала Ти ж казав що їх мало. Ти ж мені любий брат казав Гірей. Несу свій хрест на свої Голгочі А цар стромляє мені у спину Свої двойлезі каправі очі.
23156. В. Симоненко про історичну місію людини на землі («Ти знаєш, що ти - людина?») 24 KB
  Симоненко про історичну місію людини на землі Ти знаєш що ти людина В історії української літератури шістдесяті роки стали роками творчості письменників які віддали свій голос на захист простої людини. Вони намагалися пробити чиновницькобюрократичну стіну суспільства де людина була лише гвинтиком їхнього апарату а не творцем своєї долі своєї історії. Повага до людини зокрема до її гідності до права жити так як вона хоче в цьому філософська наснаженість і гуманістична спрямованість поезії Ти знаєш що ти людина Лад у...
23157. Головний герой поезій В. Симоненка 23.5 KB
  В його юнацькому серці завжди жили любов віра в людину в її творчі можливості. Такі вірші як Лебеді материнства Україні Земле рідна Україно п'ю твої зіниці вражають читачів великою синівською любов'ю поета до своєї Батьківщини непідробним почуттям патріота. Ліричний герой цих поезій наголошує що без любові до Батьківщини нема справжньої людини. У віршах Любов Вона прийшла Є в коханні і будні і свята розкрито інтимні почуття ліричного героя.
23159. Духовні цінності людини в поезії Ліни Костенко 26 KB
  Поставити свого сучасника обличчям до норм що їх виробляло людство впродовж століть задуматися над сутністю власного життя зосередитися на усвідомленні себе сином української землі взяла на себе обов'язок поетеса Ліна Костенко. Звичайно у зв'язку із своєю позицією поетапатріота Ліна Костенко перебувала в опозиції до офіційних властей тоталітарного радянського суспільства. У своїх поезіях Ліна Костенко бачить конкретних винуватців моральної і духовної деградації людей.
23160. Євген Маланюк (1897-1968) 27 KB
  Як пише сам Євген Маланюк його прізвище фігурувало ще в реєстрах старшини часів Богдана Хмельницького. В колишньому Єлисаветграді Маланюк закінчує реальну гімназію раніше тут навчалися брати Тобілевичі Марко Кропивницький Є. Мобілізація у зв'язку з першою світовою війною Київська військова школа і поручник Євген Маланюк стає командиром сотні 2го Туркестанського стрілецького полку.
23161. Євген Филимонович Маланюк 54.5 KB
  Маланюка. Маланюк емігрував спочатку жив у Каліші в таборі для інтернованих українських частин. Маланюка Стилет і стилос у 1926р.
23162. ЄВГЕН МАЛАНЮК 94 KB
  А на зібранні академії таборового літературноартистичного товариства Веселка із здавалося б недоречним до часу і місця рефератом Зброя культури виступав перед побратимами двадцятип'ятилітній поет військовий старшина 6ї дивізії генерала Безручка Євген Маланюк: Кордони економічна діяльність промисловість і торгівля це тільки зовнішні форми тільки рамки в яких проходить дійсне живе життя нації самостійної держави. Навіть для частини учасників академії а Веселка об'єднувала літературномистецькі кола інтернованих вояків ...