Виртуальные методы. Полиморфизм C++
Виртуальные методыК механизму виртуальных функций обращаются в тех случаях, когда в класс необходимо поместить функцию, которая выполняется в наследуемых классах иначе, чем в классе базовом. Виртуальные функции необходимы потому, что используются для поддержки динамического полиморфизма. Это свойство ООП поддерживается двумя способами: — на этапе компиляции, посредством перегрузки функций, и — во время выполнения программы, посредством виртуальных функций. Виртуальные функции реализуют тезис: “один интерфейс — множество методов“. Классы, содержащие одну или несколько виртуальных функций, называются полиморфными.
Как работают виртуальные функцииЕсли в базовом классе функция объявлена как виртуальная, то её вызовы будут обрабатываться методом динамического связывания. Ключевое слово virtual предписывает компилятору генерировать дополнительную информацию о функциях.
#include<iostream.h> class X
Результат выполнения программы: при x=3. Специфической особенностью указателей на классы в С++ является то, что указатель объявленный, как указатель на базовый класс может использоваться, как указатель на любой класс, производный от этого базового. Компилятор при вызове виртуальной функции определяет класс объекта для которого вызывается виртуальная функция и подбирает соответствующую версию функции.
#include<iostream.h> class Mammal int main(void) void VFunc(Mammal M)
Результат работы программы: 1--собака, 2-- кошка, иначе-- млекопитающее, 0-- выход. 1 Так как часто используется указатель на объект базового класса, хотелось бы иметь возможность удалять этот объект, к какому бы классу он не принадлежал, на самом деле, следовательно необходимо использовать виртуальные деструкторы в том случае если в классе объявлены виртуальные функции. Конструктор не может быть виртуальным и не может быть виртуального конструктра-копировщика. Если требуется передать указатель на объект произвольного класса и правильно скопировать его можно использовать виртуальный метод Clone()— создающий и возвращающий копию объекта текущего класса. Virtual Mammal* Mammal::Clone(){return new Mammal(*this);} Существует цена виртуальных методов так как необходимо поддерживать v-таблицу ,( снижение быстродействия и затраты на память), а так же необходимость писать виртуальный деструктор. Поэтому необходимо обосновывать необходимость использования виртуальных методов ( если да, то какие именно). Рекомендуется:
При работе с виртуальными функция необходимо использовать одно и тоже имя, а так же списки аргументов и тип возвращаемого параметра, если это не выполняется, то механизм виртуальных функций игнорируется.
Абстрактные классыОчень часто виртуальная функция, объявленная в базовом классе, никогда не используется в нём, то есть она представляется в виде пустой функции ( { } ). Версия виртуальной функции, которая должна быть определена, но никогда не будет использоваться, должна быть объявлена как чисто виртуальная : Класс с одной или большим количеством чисто виртуальных функций называется — абстрактным. Правила языка С++ запрещают использование таких классов, они могут использоваться только как базовые для создания других классов. Это происходит потому, что одна или несколько функций для объектов этого класса не имеют определения. Данная ситуация используется для обнаружения ошибок создания фиктивных объектов при помощи компилятора. Рекомендации:
|