c – 类模板和虚函数

给定下面的代码,当使用Sub< Model2>时,为什么编译器会抛出错误(说方法calc()不是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;
}

最佳答案 虚拟方法必须在模板中实例化,而非虚方法则不需要.

根据T“要求”的错误发生在实例化时.
非虚方法仅在使用或显式实例化时实例化.

在您的情况下,当不是虚拟时,永远不会调用Super< Model2> :: fn(它是Sub< Model2> :: fn).
在虚拟情况下,不调用Super< Model2> :: fn,但必须进行实例化,因为它是虚拟的.

点赞