是否隐式实例化了模板类的虚函数?

时间:2016-12-15 22:12:31

标签: c++ templates template-instantiation

请考虑以下代码。是否可以保证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);
}

2 个答案:

答案 0 :(得分:5)

标准部分14.7.1 / 11说

  

如果虚拟成员函数不会被实例化,那么实现是否隐式实例化类模板的虚拟成员函数是未指定的。

但是,对于典型的vtable实现,实例化类的任何构造函数都需要存在类的vtable,该类必须包含指向特化的虚函数定义的指针。所以在实践中,虚函数可能会被实例化。

答案 1 :(得分:0)

虚拟表将始终针对类层次结构进行实例化,但是,在您的情况下,无论foo是否在类创建上实际初始化,它都将依赖于编译器,因为类本身在堆栈上初始化并且从不以多态方式使用。在您的情况下,虚拟表将毫无意义。