Виртуальные функции
Спецификатор 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
Итак, было показано, что виртуальные методы можно использовать для возможности использования методов созданных в производных классах.
Смотрите также
|
Нет комментариев. Оставить комментарий: |