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

ash*_*ian 1 c++ destructor memory-leaks memory-management

我想破坏一个类的对象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;
};
Run Code Online (Sandbox Code Playgroud)

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

A *a = new B();
delete a;
Run Code Online (Sandbox Code Playgroud)

我明白了:

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

并且clear B从未打印过.我究竟做错了什么?

fel*_*lix 5

非正式地,在~A();B部分已被破坏,调用B的任何函数都没有任何意义.


有效的C++项目9:在构造或销毁期间永远不要调用虚函数.

一旦派生类析构函数运行,对象的派生类数据成员就会采用未定义的值,因此C++将它们视为不再存在.在进入基类析构函数后,该对象成为基类对象,并且C++的所有部分 - 虚函数,dynamic_cast等等 - 以这种方式处理它.