Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Охарактеризуйте віртуальні функції. Приклади.






 

Чергова модифікація базового класу призводить до несподіваних наслідків. Ця модифікація полягає в зміні специфікатора функції-члена базового класу. Ми (вперше!) використовуємо специфікатор virtual в оголошенні функції. Функції, оголошені з специфікатором virtual, називаються віртуальними функціями. Введення віртуальних функцій в оголошення базового класу (всього лише один специфікатор) має такі значні наслідки для методології об'єктно-орієнтованого програмування, що ми зайвий раз наведемо модифіковане оголошення класу A:

 

class A

{

public:

virtual int Fun1(int);

};

 

Один додатковий специфікатор в оголошенні функції і більше ніяких (поки ніяких) змін в оголошеннях похідних класів. Як завжди, дуже проста функція main (). У ній ми визначаємо покажчик на об'єкт базового класу, налаштовуємо його на об'єкт похідного типу, після чого за вказівником ми викликаємо функцію Fun1 ():

 

void main ()

{

A *pObj;

A MyA;

AB MyAB;

pObj = & MyA;

pObj-> Fun1(1);

AC MyAC;

pObj = & MyAC;

pObj-> Fun1(1);

}

 

Якби не специфікатор virtual, результат виконання вираження виклику

 

pObj-> Fun1(1);

 

був би очевидний: як відомо, вибір функції визначається типом покажчика.

 

Однак специфікатор virtual змінює всю справу. Тепер вибір функції визначається типом об'єкта, на який налаштовується покажчик базового класу. Якщо в похідному класі оголошується нестатичні функція, у якої ім'я, тип значення, що повертається і список параметрів збігаються з аналогічними характеристиками віртуальної функції базового класу, то в результаті виконання вираження виклику викликається функція-член похідного класу.

 

Відразу треба зазначити, що можливість виклику функції-члена похідного класу за вказівником на базовий клас не означає, що з'явилася можливість спостереження за об'єктом " зверху вниз" із покажчика на об'єкт базового класу. Невіртуальна функції-члени та дані, як і раніше недоступні. І в цьому можна дуже легко переконатися. Для цього достатньо спробувати зробити те, що ми вже одного разу виконали - викликати невідому в базовому класі функцію-член похідного класу:

 

//pObj-> Fun2(2);

//pObj-> AC:: Fun1(2);

 

Результат негативний. Покажчик, як і раніше, налаштований лише на базовий фрагмент об'єкта похідного класу. І все ж виклик функцій похідного класу можливий. Колись, в розділах, присвячених опису конструкторів, нами було розглянуто перелік регламентних дій, які виконуються конструктором в ході перетворення виділеного фрагмента пам'яті в об'єкт класу. Серед цих заходів згадувалася ініціалізація таблиць віртуальних функцій.

 

Наявність цих самих таблиць віртуальних функцій можна спробувати виявити за допомогою операції sizeof. Звичайно, тут все залежить від конкретної реалізації, але, по крайней мере, в версії Borland C + + об'єкт-представник класу, який містить оголошення віртуальних функцій, займає більше пам'яті, ніж об'єкт аналогічного класу, в якому ті ж самі функції оголошені без специфікатора virtual.

 

cout < < " Размеры объекта: " < < sizeof(MyAC) < < " …" < < endl;

 

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.006 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал