当你有一个虚拟析构函数时,基类指针中的"删除这个"是否会删除派生类对象?

Top*_*sic 2 c++ oop object virtual-destructor

我有一个三级深度的类层次结构,如下所示:

class A {
public: 
    virtual ~A() {}

}

class B : public A {
public:
    virtual ~B() {}
    void foo(E *e) {
        e->remove(this);
    }
}

class C : public B {
public:
    ~C() {}
}

class E {
public:
    void remove(A *a) {
        delete a;
    }
}
Run Code Online (Sandbox Code Playgroud)

好吧,我想知道当我呼叫foo()一个物体时会发生什么C.难道要删除整个对象或仅BA对象的一部分,并保留C在内存中还是部分?

jpa*_*cek 5

是要删除整个对象还是只删除对象的B和A部分,并将C部分留在内存中?

不会.它将"做正确的事"(即,删除最派生的子对象,运行其所有的析构函数等)提供A(即指针指针的静态类型delete)具有虚拟析构函数(如果class A有一个虚拟的析构函数,它的所有后代都有它.这也适用于多重继承.