如果类至少包含一个虚函数,是否总是需要将析构函数声明为虚函数?

use*_*379 4 c++

可能的重复:
何时使用虚拟析构函数?

如果一个类(具有虚函数)及其继承类的所有数据成员都是非指针类型(意味着它不能保存任何动态内存),是否需要将析构函数声明为虚函数?

例子

class base {
    int x;
public:
    virtual void fn(){}

};

class der: public base {
    int y;
public:
    void fn(){}

};
Run Code Online (Sandbox Code Playgroud)

这里我们需要一个虚拟析构函数吗?

sbi*_*sbi 5

不,这并不总是必要的。这只是一个经验法则,因此并不总是适用。

真正的规则说:

virtual当要通过基类指针删除派生类的对象时,必须声明析构函数。

否则,通过基类指针删除派生类对象会调用未定义的行为。(最可能的结果是只调用基类的析构函数。)

当然,这条规则对于新手来说是相当麻烦的,因此更简单的经验法则几乎总是正确的。这是非常可能的,你正在管理一个多态类层次结构,通过基类指针动态创建的派生类对象,这是非常不可能的,你非多态类层次做到这一点。