virtual修饰符应用探索-------虚析构

有以下定义

class CA

{

public:

    CA(){}

    ~CA(){ cout << "destruction CA" << endl; }

};

 

class CB:public CA

{

public:

    CB(){}

    ~CB(){ cout << "destruction CB" << endl;}

};

 

class CC:public CB

{

public:

    CC(){}

     ~CC(){ cout << "destruction CC" << endl;}

};

考虑如下代码

       CA *a = new CC();

       delete a;

让我们看一下结果:destruction CA

哦!你可能看到了,只有CA的析构函数被调用,假如CB,CC的析构函数内有delete 操作,内存泄露看来是不可避免的。那么假如CA的析构函数为虚函数又会怎么样呢?

class CA

{

public:

    CA(){}

    virtual ~CA(){ cout << "destruction CA" << endl; }

};

再看一下结果:

destruction CC

destruction CB

destruction CA

       每一个类的析构函数都被调用了。析构顺序是这样的:

       首先从CC开始析构,在完成CC析构函数的全部操作并结束析构之前调用CB析构函数,在完成CB析构函数的全部操作并结束析构之前调用CA析构函数,由于CA函数为最基本的类,CA析构函数在完成全部操作后就直接结束了,然后结束的是CB析构函数,最后结束的是CC析构函数。所以子类的析构函数运行时间要长与父类析构函数的运行时间。

       CA的析构函数不是虚函数,CBCC的析构函数却为虚函数,结果会怎么样?答案是编译器出错,错误信息是:BLOCK_TYPE_IS_VALID为什么出错呢?你知道吗?我暂时还没搞清楚J

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值