C++语言标准关于这个问题的阐述非常清楚:当通过基类的指针去删除派生类的对象(注),而基类又没有虚析构函数时,结果将是不可确定的。实际运行时经常发生的是,派生类的析构函数永远不会被调用。
因此,若一个类含有虚函数,就应当确保它有虚析构函数。
如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,使析构函数为虚一般是个坏主意。这将带来不必要的开销(增加了虚函数表指针)。
注:为什么会出现基类的指针指向派生类对象的情况?就是因为为了使用基类虚函数的多态性。若基类没有虚函数,那么就不应该使用“指向派生类对象的基类的指针”,因为这样的代码是毫无意义的。