执行“删除此”时缺少虚拟析构函数

Eli*_*sky 3 c++ polymorphism self-destruction virtual-destructor

C ++ FAQ Lite的16.15节讨论delete this然后提到:

自然,通常的警告适用于以下情况:当您的指针是没有虚拟析构函数的基类的指针时。

为什么会这样呢?考虑以下代码:

class ISuicidal {
public:
    virtual void suicide() = 0;
};

class MyKlass : public ISuicidal {
public:
    MyKlass() {
        cerr << "MyKlass constructor\n";
    }

    ~MyKlass() {
        cerr << "MyKlass destructor\n";
    }

    void suicide() {
        delete this;
    }
};
Run Code Online (Sandbox Code Playgroud)

因此使用:

int main()
{
    ISuicidal* p = new MyKlass;
    p->suicide();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在调用中p->suicide()即使没有虚拟析构函数MyKlass也会ISuicidal按预期调用的析构函数

在我看来,这是有道理的,因为在中MyKlass::suicidethis已知的静态类型为MyKlass*,因此将调用正确的析构函数。通过在typeid内部放置呼叫很容易验证suicide

那么FAQ条目是否不正确,还是我误会了?

Goz*_*Goz 5

你误会了 在ISuicidal中实现自杀功能(即删除此功能),您会发现,当this指针是在基类上调用delete时,它不会调用派生类的析构函数。