让我声明:我清楚地了解了构造函数或析构函数中的虚函数调用。
在下面的代码中,我试图避免虚拟析构函数仅用于实验目的。
现在我的问题是:
主要是对Destroy fun的调用会调用正确的虚函数。 我期待任何对Destroy Function的调用都应该调用正确的虚拟乐趣。
但是在Base析构函数中调用的相同Destroy函数是Base虚函数。
这与静态绑定或编译器优化有关吗?
class Base
{
public:
Base()
{
}
void Destroy()
{
callVirtual();
}
virtual void callVirtual()
{
cout<<"In Base callVirtual "<<endl;
}
~ Base()
{
cout<<"In Base Destructor"<<endl;
Destroy();
}
};
class Derived : public Base
{
public:
Derived()
{
}
void callVirtual()
{
cout"<<In Derived callVirtual"<<endl;
}
};
int main()
{
Base *pointer = new Derived();
pointer->Destroy(); // Calls the right callVirtual
return 0;
}
答案 0 :(得分:5)
在析构函数中,this
的动态类型是当前类的动态类型,而不是对象的原始动态类型。参见例如http://www.artima.com/cppsource/nevercall.html