类模板和虚函数

时间:2014-05-19 07:31:25

标签: c++ templates

鉴于下面的代码,为什么编译器在使用calc()实例时会抛出错误(说Model2方法不是Sub<Model2>的成员),如果fn()被声明为虚拟,并且在fn()不是虚拟时工作?发生了什么事?

class Model1
{
public:
    void calc(){std::cout<<"Model1 calc"<<std::endl;}
};
class Model2
{
public:
    void calc2(){std::cout<<"Model2 calc"<<std::endl;}
};
template<typename T>
class Super : public T
{
public:
    virtual void fn() // comment virtual for resolution
    { T::calc(); }
};
template<typename T>
class Sub : public Super<T>
{
public:
    void fn()
    { T::calc2(); }
};
int main()
{
    Super<Model1> bes;
    bes.fn();
    Sub<Model2> sts1;
    sts1.fn();
    return 0;
}

1 个答案:

答案 0 :(得分:2)

虚拟方法必须在模板中实例化,而非虚方法则不能。

取决于T“要求”的错误发生在实例化的时刻 非虚方法仅在使用或显式实例化时实例化。

在您的情况下,如果不是虚拟的,则永远不会调用Super<Model2>::fnSub<Model2>::fn)。 在虚拟情况下,Super<Model2>::fn未被调用,但必须进行实例化,因为它是虚拟的。