Виртуальная функция не может быть шаблонизирована.
Виртуальная функция вызывается через vtable
, который в основном является массивом указателей на функции.Каждый виртуальный метод в базовом классе занимает место в виртуальной таблице.Очевидно, что размер виртуальной таблицы должен быть известен во время компиляции, поскольку он является частью определения объекта.
class Base {
public:
virtual void hello(){};
virtual void bye(){};
}
vtable может выглядеть следующим образом:
- Указатель на
hello
. - Указатель на
bye
.
Итак, виртуальной таблице нужен указатель на две функции.
Теперь, если hello()
или bye()
быть шаблонным, как мы могли бы создать vtable?
- Указатель на
hello<int>()
- Указатель на
hello<char>()
.
Мы не можем знать заранее все варианты шаблонной функции, поэтому она неможно построить vtable.