析构函设为虚拟的好处

类继承中构造函数和析构函数的调用 现在,有三个类,类的定义如下 class CA { public: CA(){cout<<"CA constructor"< >> virtual ~CA(){cout<<"CA desstructor"< nBlockUse) 是在释放内存的时候出现这样的错误 上网查了一下,_BLOCK_TYPE_IS_VALID是用来检测内存有效性宏中的一个,这个错误说明指针使用出现了问题 后来想了一想,应该是因为继承类中出现了虚函数,所以多了一个指向虚函数表的指针,而基类中一个虚函数都没有,所以也没有这个指针啦 所以在delete的时候就出现了内存错,事实证明,这个猜想应该是站得住脚的,在CA中添加一个虚函数,即使的空的虚函数,也不会出现内存错, 关于这个问题,我想在下次继续讨论吧,这里不深入进去了, 回到正题,在CA中添加一个空的,任意的虚拟函数以后,运行正确了, 运行结果是 CA constructor CB constructor CC constructor CA desstructor 这与(2)中的情况是一样的,只要CA的析构函数不是虚拟的,就只能调用CA的析构了 最后来看一种非常Bt的做法 (5) CA CB CC中的析构函数,谁是虚拟的,无所谓,随便 修改main 代码如下 int main() { void * p = new CC(); delete p; return 0; } 运行结果 CA constructor CB constructor CC constructor 下面呢???下面没有了,晕…………………… 这种情况,构造了一个cc的对象,然后呢,没有调析构函数,直接把申请的内存释放了,最好不要这样用咯。 好了,最后,上面,基本上把所有的,我能想到的情况都整理了一下, 总结一下 如 C1 * p = new C2(); delete p; 这样的代码 这里,C1是C2的基类,C1可能是C2的爸爸,可能是爷爷,可能是爸爸的爷爷,可能是爷爷的爷爷………………………… 那么首先,调用的构造函数是 从C2的第一个祖先一直到C2………………。和C1是什么没关系 在delete p的时候,那么有以下几种情况: 1) C1或者C1的祖先(基类)中,含有虚析构函数,那么调用的析构函数的顺序是从C2一直到C2的第一个祖先 2)如果C1或者C1的祖先中,没有一个是类是含有虚析构函数的,那么调用的是从C1一直到C1(也是C2的)的第一个祖先的 3)如果C1是void,那就什么析构都不调用了。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhou_botong001/archive/2009/11/01/4754870.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值