使用upcasting时的虚拟析构函数

Adr*_*ian 3 c++ inheritance virtual-destructor

每个人都说当至少有一个类方法是虚拟的时,析构函数应该是虚拟的.
我的问题是,在使用向上转换时说析构函数应该是虚拟的是不正确的?

class A {
public:

    ~A(){
        cout << "Destructor in A" << endl;
    }
};

class B: public A
{
public:

    ~B(){
        cout << "Destructor in B" << endl;
    }
};

int main()
{
    A* a = new B;
    cout << "Exiting main" << endl;
    delete a;
}
Run Code Online (Sandbox Code Playgroud)

我在这段代码中没有任何虚函数,但是如果我不使我的基础析构函数为虚拟,它就不会调用B析构函数.是的,我知道如果我没有虚函数,使用ucpasting是没有意义的.

谢谢.

小智 13

如果您通过基指针删除派生对象,则需要虚拟析构函数.就是这样,简而言之.


CB *_*ley 6

当至少有一个类方法是虚拟的时,析构函数应该是虚拟的

这是一个经验法则,这是因为当您使用虚函数时,您正在使用运行时多态并且更有可能遇到这种情况,如果您拥有的是一个类,那么您需要销毁一个可能是派生类型的类.指向其基类子对象的指针.

通过delete在指向基类的指针上销毁派生对象时,基类中需要使用虚拟析构函数以避免未定义的行为.这是虚拟析构函数唯一需要的时间,该指南旨在帮助避免出现这种情况.

Herb Sutter提倡指导基类析构函数(即设计为继承的类的析构函数)应该是publicvirtual/ protected或非virtual.这允许您不希望基类成为继承层次结构中用于删除派生对象的点,并且您希望强制执行此操作不会无意中发生.

当然,如果你有一个纯值类,它不是一个基类,你几乎无法阻止人们从它派生,然后通过指向base的方法删除派生类.