Виртуальные функции

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

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

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

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

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

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

Копировать
class Base
{
public:
	virtual void VM();
	void M();
};
class Derived: public Base
{
public:
	viod 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
Итак, было показоно, что виртуальные методы можно использовать для возможности использования методов созданных в производных классах.


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

Виртуальные базовые классы
Виртуальные деструкторы