从C++中的虚拟析构函数调用虚拟方法

Calling virtual method from virtual destructor in C++

本文关键字:虚拟 析构 方法 函数调用 C++      更新时间:2023-10-16

我想破坏类 B 的对象。

class A {
public:
    A() {
        std::cout << "construct A" << av::endl;
        a = new int;
    }
    virtual ~A() {
        std::cout << "destruct A" << av::endl;
        this->clear();
    }
    virtual void clear() {
        std::cout << "clear A" << av::endl;
        delete a;
    }
protected:
    int *a;
};
class B : public A {
public:
    B() {
        std::cout << "construct B" << av::endl;
        b = new int;
    }
    ~B() {
        std::cout << "destruct B" << av::endl;
    }
    void clear() override {
        std::cout << "clear B" << av::endl;
        delete b;
        delete this->a;
    }
private:
    int *b;
};

我希望用clear()方法完成它。但是当我执行以下代码时:

A *a = new B();
delete a;

我得到:

构造 A 构造 B 破坏 B 破坏 A 清除 A

而且clear B永远不会打印。我做错了什么?

非正式地说,~A(); B部分已经被销毁,调用B的任何函数都没有任何意义。


有效C++ 第 9 项:在建造或破坏过程中切勿调用虚拟函数。

派生类

析构函数运行后,对象的派生类 数据成员假定未定义的值,因此C++将它们视为没有 存在的时间更长。进入基类析构函数后,对象 成为一个基类对象,C++的所有部分——虚函数, dynamic_cast s等,——这样对待它。