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).


 

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

27459. Государство как субъект правоотношений 30 KB
  Государство как субъект правоотношений. Государство: обладает как субъект правоотношений особым свойством суверенитетом ; общая правосубъектность государства определяется Конституцией данного государства нормами международного права; является субъектом внутригосударственных международных правоотношений; относится к т. Государство во всех правоотношениях выступает как политический субъект проявляющий властные полномочия как носитель суверенитета. Государство регламентирует статус участников правоотношений является субъектом...
27460. Государство: понятие, назначение и признаки 28 KB
  Государство – это политикотерриториальная суверенная организация публичной власти общества взимающая с населения налоги издающая законы и обеспечивающая их реализацию. Марксистсколенинское понимание признаков государства: 1 разделение населения по территориальному признаку; 2 наличие публичной власти которая стоит над обществом; 3 наличие налоговой системы. принадлежность людей к данному обществу гражданству; порядок и понятия формы предоставления гражданства именно через понятия гражданство население происходит объединение...
27461. Гражданское общество: понятие, структура, характер и формы его взаимодействия с государственно-правовыми институтами 29.5 KB
  Госво управляет обществом служит формой его организации. общество – способное противостоять госву контролировать его и заставить служить обществу. Это общество которое может сформировать правовое госво.
27462. Дайте классификацию юридических (фактических) составов 24 KB
  Такая совокупность юрих фактов в юриспруденции именуется фактическим юрим составом. Юридический фактический состав это система юридических фактов предусмотренных нормами права в качестве основания для наступления правовых последствий возникновение изменение прекращение правоотношения. 2 По процессу накопления фактов: Завершённые процесс накопления фактов завершен; Незавершённые процесс накопления не закончен. 3 По способу накопления фактов: Простые юридические составы с независимым накоплением элементов.
27463. Дайте отличия нормативного акта от правоприменительного (на конкретном примере) 25.5 KB
  Нормативные правовые акты следует отличать от индивидуальных и интерпретационных актов. Индивидуальные правовые акты – это акты государственных органов негосударственных организаций должностных лиц выражающие решение по конкретному юридическому делу приговор или решение суда приказ руководителя предприятия или учреждения и др. Индивидуальные акты – это акты применения права поэтому их называют еще правоприменительными. В отличие от индивидуальных нормативные правовые акты носят общеобязательный характер и отличаются неконкретностью...
27464. Действие нормативно-правовых актов во времени, в пространстве и по кругу лиц 27.5 KB
  Действие нормативноправового акта порождение тех юридических последствий которые в нем предусмотрены. Действие т. во времени Действие нормативноправовых актов во времени определяется двумя моментами: моментом вступления нормативноправового акта в силу и моментом утраты им юридической силы. Существуют такие понятия как футуроспективное действие закона обращен в будущее рассчитан на facta futura ретроактивное распространение на отношения возникшие до вступления данного акта в силу и ультраактивное действие акт утрачивает силу а...
27465. Действие права 28.5 KB
  Действие права это действие составляющих его разнообразных норм которые в официальной форме выражены в различных нормативноправовых и иных правоустановительных актах. Эти характеристики пределов действия норм права официально закрепляются в соответствующих нормативноправовых актах. Действие во времени определяется периодом времени от момента вступления нормативноправового акта и содержащихся в нем норм в силу до момента ее утраты. Время вступления в законную силу разных нормативноправовых актов определяется различными способами: 1...
27466. Демократический политический режим 24.5 KB
  Государственнополитический режим это элемент формы государства характеризующий совокупность приемов методов способов и средств осуществления государственной власти. Основными признаками демократического режима являются: господство закона; разделение властей; наличие у граждан реальных политических и социальных прав и свобод и их юридическая защищенность и гарантированность; выборность и сменяемость центральных и местных органов государственной власти их подотчетность перед избирателями гласность; наличие свободно формируемых...
27467. Законность, понятие и характеристика 25.5 KB
  Понятие законности неотделимо от понятия права. В результате реализации этого требования органами государства и его должностными лицами возникает особый режим система общественных отношений – режим законности. Законность как принцип – одно из руководящих системообразующих начал построения и деятельности правового государства выражающееся в системе принципов и требований отражающих идею законности. Режим законности – такое состояние общественных отношений когда во взаимоотношениях между государственной властью и населением господствует...