Рассмотрим следующий код. Гарантируется ли это, что Derived<int>::foo()
будет создан экземпляр? foo()
является виртуальным и вызывается не виртуальной функцией базового класса.
#include <iostream>
class Base
{
public:
void bar() { foo(); }
private:
virtual void foo() = 0;
};
template <typename T> class Derived: public Base
{
public:
Derived(T t_) : t(t_) {}
private:
void foo() override { std::cout << t; }
T t;
};
Derived<int> make_obj()
{
return Derived<int>(7);
}
Стандартный раздел 14.7.1 / 11 говорит
Не определено, будет ли реализация неявно создавать экземпляр виртуальной функции-члена шаблона класса, если в противном случае функция виртуального члена не была бы создана.
Однако для типичной реализации vtable создание экземпляра любого конструктора класса требует наличия vtable для класса, который должен содержать указатель на определение виртуальной функции специализации. Таким образом, на практике виртуальная функция, вероятно, будет реализована.
Виртуальная таблица всегда будет создаваться для иерархии классов, однако, в вашем случае это будет зависеть от компилятора, будет ли foo фактически инициализирована при создании класса, поскольку сам класс инициализируется в стеке и никогда не используется полиморфно. Виртуальный стол будет бессмысленным в вашем случае.