11. В С++ виртуальные функции (virtual functions) позволяют использовать полиморфизм (polymorhpism) классов. Так как виртуальные функции могут использоваться только внутри классов, то иногда их называют виртуальными методами (virtual methods).

Несколько замечаний по виртуальным функциям:

1. Виртуальные функции используются только в классах. Поэтому часто используется название - виртуальные методы.

2. В массивах указателей на базовый класс можно хранить объекты только полиморфных типов (базовый и все производные).

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

Виртуальные функции объявляются с помощью ключевого слова virtual в базовом классе. При этом для базового класса и для всех производных создаётся таблица указателей на функции - виртуальная таблица методов/функций (virtual function table или vtable). Для каждого класса создаётся своя таблица. Количество элементво в таблице равно количеству виртуальных методов. В таблице хранятся фактические адреса методов, определённых в классах. Также в базовом классе объявляется дополнительное поле __vfptr (наследуется всеми производными классами) - указатель на таблицу виртуальных функций класса. Т.е. когда создаётся объект самого класса или любого производного, в нём __vfptr присваивается адрес таблицы виртуальных функций этого класса (или производных).

 

Виртуальные функции нужны в C++ для поддержки полиморфизма. Полиморфизм позволяет использовать одинаковый синтаксис для разных классов:

Рассмотрим простой код:

 

class Base

{

public:

  virtual void vf ()

  {

    cout << "Базовый класс\n";

  }

};

 

class Derived : public Base

{

public:

  void vf () // это тоже виртуальная функция

  {

    cout << "Производный класс\n";

  }

};

Hosted by uCoz