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

ВІРТУАЛЬНІ ФУНКЦІЇ_________________________________________________________________

Читайте также:
  1. АБСТРАКТНІ КЛАСИ І ЧИСТІ ВІРТУАЛЬНІ ФУНКЦІЇ_________________________________________
  2. ВІРТУАЛЬНІ БАЗОВІ КЛАСИ___________________________________________________________
  3. Віртуальні канали і віртуальні шляхи
  4. Класний керівник: завдання, функції, форми роботи з колективом учнів. Права та обов’язки класного керівника.
  5. Мови, рівні і віртуальні машини
  6. Розділ III. Функції, форми та методи управління органів державної виконавчої влади та органів місцевого самоврядування.
  7. Тема 6.2. Основні завдання й функції Керування екологічної експертизи й оцінки впливу на природне середовище, його структура
  8. Функції вчителя у суспільстві та соціально – педагогічні якості сучасного педагога. Закон «Про загальну середню освіту» про вимоги до сучасного вчителя.
  9. Функції державних установ і організацій у підготовці науково- педагогічних та наукових кадрів
  10. Функції житлового права – основні напрямки правового впливу на житлові правовідносини з метою їх впорядкування.
  11. Функції правосвідомості. Роль правосвідомості в процесі правотворчості і правореалізації

 

До механізму віртуальних функцій звертаються в тих випадках, коли в кожному похідному класі потрібний свій варіант деякої компонентної функції.

Віртуальний означає видимий, але не існуючий в реальності. Коли використовуються віртуальні функції, програма, яка, здавалося б, викликає функцію одного класу, може у цей момент викликати функцію зовсім іншого класу. А для чого взагалі потрібні віртуальні функції? Уявіть, що є набір об'єктів різних класів, але вам хочеться, щоб вони всі були в одному масиві і викликалися за допомогою одного і того ж виразу. Наприклад, в графічній програмі є різні геометричні фігури: трикутник, куля, квадрат і так далі. В кожному з цих класів є функція draw(), яка малює на екрані фігури. Тепер, допустимо, вам захотілося створити картинку, згрупувавши деякі з цих елементів. Як би зробити це без зайвих складнощів? Підхід до рішення цього завдання такий: створіть масив покажчиків на елементи картинки, які не повторюються: shape* ptarr[100]; //масив з 100 вказівників на фігури Якщо в цьому масиві містяться вказівники на всі необхідні геометричні фігури, то вся картинка може бути намальована в звичайному циклі: for(int j=0; j<N; j++) ptarr[j]->draw(); Абсолютно різні функції виконуються за допомогою одного і того ж виклику! Якщо вказівник в масиві ptarr вказує на кулю, викличеться функція, що малює кулю, якщо він указує на трикутник, то малюється трикутник. Ось це і є поліморфізм, тобто різні форми. Функції виглядають однаково - це вираз draw(), але реально викликаються різні функції, залежно від значення ptarr[j].
     

Коли використовуються віртуальні функції, програма, яка, здавалося б, викликає функцію одного класу, може у цей момент викликати функцію зовсім іншого класу.

Класи, що включають такі функції, називаються поліморфними і грають особливу роль в ООП.

Поліморфізм - одна з ключових особливостей об'єктно-орієнтованого програмування (ООП) разом з класами і спадкоємством.

Щоб використовувати поліморфізм, необхідно виконувати деякі умови.

§ По-перше, всі класи (всі ці трикутнички, кулі і т. д.) повинні бути спадкоємцями одного і того ж базового класу.

§ По-друге, функція draw(), повинна бути оголошена віртуальною (virtual) в базовому класі.

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

Віртуальні функції надають механізм пізнього (відкладеного) або динамічного скріплення. Будь-яка нестатична функція базового класу може бути зроблена віртуальною, для чого використовується ключове слово virtual.

Приклад.

class base

{

public:

virtual void print(){cout<<“nbase”;}

...

};

class dir: public base

{

public:

void print(){cout<<“ndir”;}

};

void main()

{

base B,*bp = &B;

dir D,*dp = &D;

base *p = &D;

bp ->print(); // base

dp ->print(); // dir

p ->print(); // dir

}

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

Вибір того, яку віртуальну функцію викликати, залежатиме від типу об'єкту, на який фактично (у момент виконання програми) направлений вказівник, а не від типу вказівника.

Віртуальними можуть бути тільки нестатичні функції-члени.

Віртуальність успадковується. Після того, як функція визначена як віртуальна, її повторне визначення в похідному класі (з тим же самим прототипом) створює в цьому класі нову віртуальну функцію, причому специфікатор virtual може не використовуватися.

Конструктори не можуть бути віртуальними, на відміну від деструкторів. Практично кожен клас, що має віртуальну функцію, повинен мати віртуальний деструктор.


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.006 сек.)