Виртуальная функция определяется путем ключевого слова virtual перед описанием функции. Причем при переопределении виртуальной функции так же необходимо использовать это ключевое слово.
Пример:
- Код: выделить все
class Shape
{
public:
virtual void Draw();
};
class Triangle: public Shape
{
public:
virtual void Draw();
};
class Circle: public Shape
{
public:
virtual void Draw();
};
При реализации этих классов, в классе Shape можно определить функцию Draw как ничего не делающую. Действительно при реализации класса Shape мы не знаем какие фигуры будут использованы, поэтому и не можем определить эту функцию. В производных классах мы уже можем это сделать, более того должны это сделать.
А теперь пример использования:
- Код: выделить все
Shape *m_shape;
switch(i)
{
case 1: m_shape=new Triangle;
break;
case 2: m_shape=new Circle;
break;
default: m_shape=NULL;
}
if(m_shape!=NULL) m_shape.Draw();
Разберемся как работает этот код. Сначала мы создаем ссылку на базовый класс, это нужно для того чтобы присвоить ей значение производного класса. Использование ссылки это единственный способ это сделать. Далее в операторе switch выбирается какой производный класс будет присвоен переменной или присваиваем ей значение NULL (нет значения). Далее проверяем присвоенно ли m_shape значение и если присвоено вызываем метод Draw. Какой конкретно метод будет вызван зависит от того какой производный класс использован. Если использован Triangle, то будет вызван метод Draw для этого класса. Если Circle, то соответственно для него.