Справочник по C/C++
Виртуальные функции

Спецификатор virtual создаёт виртуальную функцию. Виртуальная функция — это член базового класса, который может быть переопределён производным классом. Если функция не переопределяется производным классом, используется определение базового класса.

Чистая виртуальная функция — предоставляет собой функцию-член, которая не имеет определения. Это значит, что чистая виртуальная функция должна быть переопределена в производном классе. Прототип чистой виртуальной функции записывается следующим образом.

virtual тип_возврата имя_функции(список_параметров) = 0;
Элемент "= 0" сообщает компилятору, что эта виртуальная функция не имеет определения, связанного с базовым классом.

Динамический полиморфизм достигается в том случае, когда к виртуальным функциям можно получить доступ через указатель на базовый класс. При реализации такой возможности именно тип адресуемого объекта определяет, какая версия виртуальной функции будет вызвана.

При вызове метода с использованием указателя на базовый класс действуют следующие правила:

  • для виртуального метода вызывается метод, соответствующий типу объекта, на который указывает указатель;
  • для невиртуального метода вызывается метод, соответствующий типу самого указателя.

В результате при создании указателя базового класса, который указывают на объект производного класса будет вызываться метод производного класса. Например.

class Base
{
public:
	virtual void VM();
	void M();
};
class Derived: public Base
{
public:
	void VM();
	void M();
};

Derived D;	//объект производного класса Derived;
Derived *pD = &D;	//указатель на объект D классы Derived
Base *pB = &D;		//указатель на объект D классы Base

pB->VM();	//вызов метода VM класса Derived
pD->VM();	//вызов метода VM класса Derived
pB->M();	//вызов метода M класса Base
pD->M();	//вызов метода M класса Derived

/*если бы ключевое слово virtual не стояло в классе B,
 то вызовы производились бы следующим образом*/
pB->VM();	//вызов метода VM класса B
pD->VM();	//вызов метода VM класса Derived
pB->M();	//вызов метода M класса Base
pD->M();	//вызов метода M класса Derived
Итак, было показано, что виртуальные методы можно использовать для возможности использования методов созданных в производных классах.


Смотрите также






Нет комментариев.



Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: