C++_多态_03_虚析构函

  • 👋 Hi, I’m liubo
  • 👀 I’m interested in harmony
  • 🌱 I’m currently learning harmony
  • 💞️ I’m looking to collaborate on …
  • 📫 How to reach me …
  • 📇 sssssdsdsdsdsdsdasd
  • 🎃 dsdsdsdsdsddfsgdgasd
  • 🍺 jyukyuiyuiyuigkasd
  • 🍥 fsdfgdsgsdgdgadsa
  • ✨ xcvxcvxcvxcvdasdaasd
  • 🍰 dazdsxasxsaxsaasdsa
  • 🚨 gdfgdshdfhfhygjtyu

C++_多态_03_虚析构函数

1. 析构函数的重写

如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同。虽然函数名不相同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor。

class Base

{
   public:
    virtual ~Base()

    {  // 虚析构函数

         cout << "Base destructor called!" << endl;
    }
};

class Derived : public Base

{
   public:
    virtual ~Derived()

    {
         cout << "Derived destructor called!" << endl;
    }
};

int main()

{
    Base* b = new Derived();  // 基类指针指向派生类对象

    delete b;  // 调用 Derived 的析构函数,然后调用 Base 的析构函数

    return EXIT_SUCCESS;
}

运行结果

Derived destructor called!
Base destructor called!

2. 非虚析构函数

继承体系中,子类对象指向析构时候,本身就会现执行子类再执行父类

class Base
{
   public:
    ~Base()
    {  // 虚析构函数
        cout << "Base destructor called!" << endl;
    }
};

class Derived : public Base
{
   public:
    ~Derived()
    {
        cout << "Derived destructor called!" << endl;
    }
};

int main()
{
    printf("--------------------begain-------------------\n");
    Base* a = new Derived();  // 基类指针指向派生类对象
    Derived* b = new Derived();

    delete a;  // 只调用 Base 的析构函数,无法调用子类虚构函数
    delete b;  // 调用 Derived 的析构函数,然后调用 Base 的析构函数

    printf("--------------------end----------------------\n");
    return EXIT_SUCCESS;
}

运行结果

--------------------begain-------------------
Base destructor called!
Derived destructor called!
Base destructor called!
--------------------end----------------------

3. 总结

所以说析构函数是否需要写成虚析构函数,首先得发生多态行为,才需要父类析构写成虚析构,这也才可以保证delete 父类指针时候,能够去调用子类的析构函数;

本质我们delete父类指针,就是为了析构子类对象的,因为父类指针指向了子类对象。为了析构子类对象,那么就需要多态,这个行为才会产生;需要多态就必须子类重写父类的虚析构函数;

以上就是今天要讲的内容,后续会有更多内容。

4. 参考资料

版权声明:本文参考了其他资料和优快云博主的文章,遵循CC 4.0 BY-SA版权协议,现附上原文出处链接及本声明。

  1. https://blog.youkuaiyun.com/m0_46606290/article/details/124017703




















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值