69726

Віртуальні функції

Лекция

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

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

Украинкский

2014-10-09

33 KB

0 чел.

Тема 4: Віртуальні функції

Віртуальна функція (virtual function) — це функція-член, оголошена в базовому класі і перевизначена в похідному. Щоб створити віртуальну функцію, слід вказати ключове слово virtual перед її оголошенням в базовому класі. Похідний клас перевизначає цю функцію, пристосовувавши її для своїх потреб. По суті, віртуальна функція реалізує принцип "один інтерфейс, декілька методів", лежачий в основі поліморфізму. Віртуальна функція в базовому класі визначає вид інтерфейсу, тобто спосіб виклику цієї функції. Кожне перевизначення віртуальної функції в похідному класі реалізує операції, властиві лише даному класу. Інакше кажучи, перевизначення віртуальної функції створює конкретний метод (specific method).

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

Розглянемо спершу наступний приклад.

#include <iostream>

using namespace std;

class base {

public:

virtual void vfunc() {

cout << "Функція vfunc() з класу base.\n";

}

};

class derived1 : public base {

public:

void vfunc() {

cout « "Функція vfunc() з класу derived1.\n";

}

};

class derived2 : public base {

public:

void vfunc() {

cout « " Функція vfuncO з класу derived2.\n" ;

}

};

int main() (

base *p, b;

derived1 d1;

derived2 d2 ;

// Покажчик на об'єкт базового класу.

Р = &Ь;

p->vfunc(); // Виклик функції vfunc() з класу base.

// Покажчик на об'єкт класу derived1.

р = &d1;

p->vfunc(); // Виклик функції vfunc(j з класу derived1.

// Покажчик на об'єкт класу derived2.

р = &d2;

p->vfunc(); // Виклик функції vfunc() з класу derived2.

return 0;

}

Ця програма виводить на екран наступні рядки.

Функція vf unc () з класу base.

Функція vfunc() з класу derived1.

Функція vfunc () з класу derived.2 .

Як показує ця програма, усередині класу base оголошена віртуальна функція vfunc (). Зверніть увагу на ключове слово virtual в оголошенні функції. При перевизначенні функції vfunc () у класах derived1 і derived2 ключове слово virtual не потрібне. (Проте його використання не є помилкою, просто воно не обов'язкове.)

У даній програмі класи derived1 і derived2 є похідними від класу base. Усередині кожного з цих класів функція vfunc () перевизначається наново відповідно до нового призначення. У програмі main() оголошені чотири змінні.

p - Покажчик на базовий клас

b - Об'єкт базового класу

d1 - Об'єкт класу derived1

d2 - Об'єкт класу derived2

Крім того, покажчику р привласнюється адреса об'єкту b, а функція vfunc() викликається за допомогою покажчика р. Оскільки покажчик р посилається на об'єкт класу base, виконується варіант функції vfunc () з базового класу. Потім покажчику р привласнюється адреса об'єкту d1, і функція vfunc () знову викликається з його допомогою. Цього разу покажчик р посилається на об'єкт класу derived1. Отже, викликається функція derived1:: vfunc (). В результаті покажчику р привласнюється адреса об'єкту d2, тому вираз p->vfunc() приводить до виклику функції vfunc Про з класу de-rived2. Принципово важливо, що варіант функції, що викликається, визначається типом об'єкту, на який посилається покажчик р. Крім того, вибір відбувається в ході виконання програми, що забезпечує основу динамічного поліморфізму.

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

d2.vfunc(); // Викликається функція vfunc() з класу derived2

Не дивлячись на те що такий виклик віртуальної функції помилкою не є, ніяких переваг він не надає.

На перший погляд, перевизначення віртуальної функції в похідному класі мало відрізняється від звичайного перевантаження функцій. Проте це не так, і термін перевантаження непридатний до перевизначення віртуальних функцій з кількох причин. Найбільш важлива відмінність полягає в тому, що прототип віртуальної функції, що перевизначається, повинен точно співпадати з прототипом, визначеним в базовому класі. віртуальні функції відрізняються від переобтяжених, які відрізняються типами і кількістю параметрів. (Фактично при перевантаженні функцій типи і кількість i параметрів повинні відрізнятися! Саме ці відмінності дозволяють компілятору вибрати правильний варіант переобтяженої функції.) При перевизначенні віртуальної функції всі аспекти їх прототипів повинні бути однаковими. Якщо не дотримував правило, компілятор вважатиме ці функції просто переобтяженими, а їх віртуальна природа буде втрачена. Друге важливе обмеження полягає в тому, що віртуальні функції не можуть бути статичними членами класів. Крім того, ой можуть бути дружніми функціями. І, нарешті, конструктори не можуть бути віртуальними, хоча на деструкції це обмеження не розповсюджується.

Із-за перерахованих обмежень для перевизначення віртуальної функції в похідному класі використовується термін заміщення (overriding).


 

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

40725. Предпринимательство как вид экономической деятельности. Виды предпринимательства 35 KB
  Виды предпринимательства. Рыночная экономика экономика свободного предпринимательства. В зависимости от содержания и направленности предпринимательской деятельности объекта приложения капитала и получения конкретных результатов связи предпринимательской деятельности с основными стадиями воспроизводственного процесса различают следующие виды предпринимательства: 1. Коммерческое торговое предпринимательство Принцип организации торгового предпринимательства несколько отличается от производственного так как предприниматель выступает...
40726. Инфраструктурное обеспечение предпринимательской деятельности 25 KB
  Cистема общих условий воспроизводства предпринимательского типа представляющая собой совокупность техникотехнологических организационноэкономических и социальных взаимосвязей тех элементов инфраструктуры которые обеспечивают обслуживание процесса предпринимательства на уровне макро мезо и микроэкономики. являются научность и системность в формировании и развитии предпринимательства и его инфраструктуры а также постепенность и многообразие моделей инфраструктурного обеспечения предпринимательства. Прежде всего нужна трансформация...
40727. Виды и формы предпринимательской деятельности 39 KB
  Рыночная экономика экономика свободного предпринимательства. В зависимости от содержания и направленности предпринимательской деятельности объекта приложения капитала и получения конкретных результатов связи предпринимательской деятельности с основными стадиями воспроизводственного процесса различают следующие виды предпринимательства: 1. Коммерческое торговое предпринимательство Принцип организации торгового предпринимательства несколько отличается от производственного так как предприниматель выступает непосредственно в роли...
40728. Государственное регулирование предпринимательской деятельности 28.5 KB
  Целью государственного регулирования предпринимательской деятельности является создание определенных условий обеспечивающих нормальное функционирование экономики в целом и стабильное участие предпринимателей страны в международном разделении труда и получение от этого оптимальных выгод. В обобщенном виде в задачи государственного регулирования входят: разработка принятие и контроль за законодательством обеспечивающим правовую основу и защиту интересов предпринимателей; повышение эффективности государственного регулирования и снижение...
40729. Малое предпринимательство, его фин-экон и организационные особенности 41.5 KB
  В современных условиях роль малого бизнеса в рыночной экономике растет. Функции малого бизнеса: Экономические функции малого бизнеса: Придает рыночной системе необходимую гибкость активизация структурных сдвигов процессов разгосударствления и приватизации. Социальные функции малого бизнеса: Обеспечивает рост занятости. Но все перечисленные достоинства малого бизнеса проявляются отнюдь не автоматически.
40730. Среднее и крупное предпринимательство 30.5 KB
  Формы взаимодействия малого среднего и крупного бизнеса в рамках сетевой экономики В современной развитой рыночной экономике малый бизнес оказывается подчинен крупному бизнесу через систему подрядов и субподрядов. Крупному бизнесу как правило обеспечивает гарантию возврата кредита и обеспечивает устойчивые долгосрочные отношения с подрядчиком или субподрядчиком . С помощью франчайзинга малый бизнес получает возможность стабилизировать внешнюю среду обеспечить конкурентные преимущества. Крупный бизнес расширяет сферу контроля над рынком и...
40731. Критерии выделения малого бизнеса в России 28.5 KB
  В реальный сектор экономики входят как отрасли материального производства так и сфера производства нематериальных форм богатства и услуг. В результате научнотехнической революции и роста производительности труда резко изменилось соотношение в нем между отраслями материального производства и сферой услуг. В индустриально развитых странах доля занятых в сфере услуг почти в два раза превышает эту долю в отраслях материального производства составляя более двух третей общей численности занятых. Информатизация экономики порождая дальнейшие...
40732. Формы финансовой поддержки малых предприятий 30 KB
  Государственная поддержка малого предпринимательства реализуется по следующим направлениям: формирование инфраструктуры поддержки и развития малого предпринимательства; создание льготных условий использования государственных финансовых материальнотехнических и информационных ресурсов научнотехнических разработок и технологий; учреждение порядка регистрации субъектов малого предпринимательства лицензирования их деятельности сертификации их продукции предоставления статистической и бухгалтерской отчетности; поддержка...
40733. Современные тенденции развития малого предпринимательства в регионах 48.5 KB
  Современные тенденции развития малого предпринимательства в регионах. В современных условиях роль малого бизнеса в рыночной экономике растет. Функции малого бизнеса: Экономические функции малого бизнеса: Придает рыночной системе необходимую гибкость активизация структурных сдвигов процессов разгосударствления и приватизации. Социальные функции малого бизнеса: Обеспечивает рост занятости.