Виртуальная функция в C ++ по определению - это функция, объявленная с ключевым словом virtual
(сразу или в одном из базовых классов). Вот и все.
Теперь вызовы виртуальных функций могут быть разрешены статически или динамически . Динамически разрешаемый вызов - это вызов, который разрешается в соответствии с типом динамического объекта, используемого в вызове. Вот и все.
Ничто в вышеприведенном не имеет ссылок на какие-либо "указатели на функции". Однако в типичной реализации для реализации правильного поведения динамических вызовов используется таблица с указателями функций (указывающими на виртуальные функции). Эта таблица называется «VMT», «VFT» или «vtable».
Другими словами, указатель на функцию - это деталь реализации, обычно используемая для поддержки динамических вызовов виртуальных функций.
Чтобы проиллюстрировать это далее, обратите внимание, например, на то, что даже если какая-то функция является виртуальной, но она никогда не вызывается динамически , тогда нет необходимости создавать какие-либо «указатели» для этой функции. По этой причине некоторые компиляторы не генерируют VMT для абстрактных классов, поскольку, хотя эти классы имеют виртуальные функции, эти функции никогда не вызываются динамически.