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