鉴于下面的代码,为什么编译器在使用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;
}
答案 0 :(得分:2)
虚拟方法必须在模板中实例化,而非虚方法则不能。
取决于T
“要求”的错误发生在实例化的时刻
非虚方法仅在使用或显式实例化时实例化。
在您的情况下,如果不是虚拟的,则永远不会调用Super<Model2>::fn
(Sub<Model2>::fn
)。
在虚拟情况下,Super<Model2>::fn
未被调用,但必须进行实例化,因为它是虚拟的。