虚析构函数的一点理解

千万不要将析构函数和虚函数混淆起来。

不管析构函数是不是虚函数,将析构函数设为虚函数是希望在通过基类指针删除派生类对象时调用派生类的析构函数。

如果析构函数不是虚函数,派生类对象没有Vptr,编译器会调用基类的析构函数(在编译时就确定了)。

  这样,用户在派生类析构函数中填写的代码就不会被调用,派生类成员对象的析构函数也不会被调用。不过,派生类对象空间还是会被正确释放的,堆管理程序知道对象分配了多少空间。

 

#include <iostream>
using namespace std;
class B{
public:
    B(){
        cout<<"B"<<endl;
    }
    virtual ~B(){
        cout<<"~B"<<endl;
    }
};
class D:public B{
public:
    D(){
        cout<<"D"<<endl;
    }
    virtual ~D(){
        cout<<"~D"<<endl;
    }
};

int main()
{
    B *pb=new D;
    delete pb;
    return 0;
}


输出结果:

B

D

~D

~B

 

如果将析构函数的virtual关键词去掉,则输出结果为:

B

D

~B

即对象D 没有调用析构函数,没有被析构

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值