是模板类的虚拟函数,隐式实例化



考虑以下代码。是否保证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是否实际上是在类创建上实际初始化的,因为类本身是在一个初始化的,堆栈,从未使用多态性使用。在您的情况下,虚拟表将毫无意义。

最新更新