给定下面的代码,当使用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,但必须进行实例化,因为它是虚拟的.