模板 class 的虚函数是否被隐式实例化?
Is a virtual function of a template class implicitly instantiated?
考虑以下代码。是否保证 Derived<int>::foo()
会被实例化? foo()
是虚函数,由基 class.
的非虚函数调用
#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 说
It is unspecified whether or not an implementation implicitly instantiates a virtual member function of a class template if the virtual member function would not otherwise be instantiated.
但是,对于典型的 vtable 实现,实例化 class 的任何构造函数都需要存在 class 的 vtable,它必须包含指向专业化虚函数定义的指针。所以实际上虚函数可能会被实例化。
Virtual table 将始终为 class 层次结构实例化,但是,在您的情况下,foo 是否在 class 创建时实际初始化将取决于编译器,因为class 本身是在堆栈上初始化的,从未以多态方式使用。虚拟 table 在您的情况下将毫无意义。
考虑以下代码。是否保证 Derived<int>::foo()
会被实例化? foo()
是虚函数,由基 class.
#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 说
It is unspecified whether or not an implementation implicitly instantiates a virtual member function of a class template if the virtual member function would not otherwise be instantiated.
但是,对于典型的 vtable 实现,实例化 class 的任何构造函数都需要存在 class 的 vtable,它必须包含指向专业化虚函数定义的指针。所以实际上虚函数可能会被实例化。
Virtual table 将始终为 class 层次结构实例化,但是,在您的情况下,foo 是否在 class 创建时实际初始化将取决于编译器,因为class 本身是在堆栈上初始化的,从未以多态方式使用。虚拟 table 在您的情况下将毫无意义。