加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用向上转换时的虚拟析构函数

发布时间:2020-12-16 10:50:46 所属栏目:百科 来源:网络整理
导读:每个人都说当至少有一个类方法是虚拟的时,析构函数应该是虚拟的. 我的问题是,在使用向上转换时说析构函数应该是虚拟的是不正确的? class A {public: ~A(){ cout "Destructor in A" endl; }};class B: public A{public: ~B(){ cout "Destructor in B" endl;
每个人都说当至少有一个类方法是虚拟的时,析构函数应该是虚拟的.
我的问题是,在使用向上转换时说析构函数应该是虚拟的是不正确的?

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;
}

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

谢谢.

解决方法

a destructor should be virtual when at least one of class methods is virtual

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

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

Herb Sutter提出了基类析构函数(即设计为继承的类的析构函数)应该是公共的和虚拟的,或者是受保护的和非虚拟的.这允许您不希望基类成为继承层次结构中用于删除派生对象的点,并且您希望强制执行此操作不会无意中发生.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读