实际执行时,通常发生的是派生对象成分没被销毁。基类通常会被销毁,造成一个“局部销毁”对象。解决方法很简单,给基类一个虚析构函数,此后删除的派生类对象就会如你想要的那般。
当对象调用某一个虚函数,实际被调用的取决于vptr所指的那个vtbl——编译器在其中寻找适当的函数指针。
class A{
public:
virtual ~A()=0; //声明纯虚函数
}
但必须为这个纯虚函数提供一份定义:
A::~A(){} //纯虚函数的定义
编译器会在A的派生类的析构函数中创建一个对~A的调用动作,所以你必须为这个函数提供一份定义。
“给基类一个虚析构函数”,这个规则只适用于带多态性质的基类身上。这个基类的设计目的是为了用来“通过基类接口处理派生类对象”。并非所有的 基类设计都是为了多态用途,例如标准string和STL容器。
请记住: