深入分析虚析构函数

CRAZII @ CSDN

from: 我自己的百度博客 http://hi.baidu.com/%CF%F4%CA%AE%C8%FD%C0%C9/blog/item/26f01108ac3dce37e9248889.html

 

 

析构函数何时该时虚拟的?
  当你可能通过基类指针删除派生类对象时。
  
  虚函数绑定到对象的类的代码,而不是指针/引用的类。如果基类有虚析构函数,delete basePtr时(译注:即基类指针),*basePtr 的对象类型的析构函数被调用,而不是该指针的类型的析构函数。这通常是一件好事情。

以上摘选自: http://blog.tianya.cn/blogger/post_show.asp?BlogID=75687&PostID=6299328

 

笔者在VS2005测试:
   

 

 

//当t0的析构声明为virtual时,delete所做的(正确工作)是:
//1.调用t1::~t1()
//2.调用t0::~t0()
//3.调用t1::operator delete

//对于上例中的情况:
//当t0的析构函数没有声明virtual时,delete operator做的工作就是
//1.只调用 t0::~t0()                                                               ****问题1
//2.调用::operator delete(或t0::operator delete)                  ****问题2

以前只是知道,没有virtual声明虚析构函数的时候,通过基类指针的析构会出现问题:只析构基类(问题1).
这里要注意,如果没有声明virtual,那么某些情况下,不仅仅是析构函数的调用有问题,operator delete也会出现问题.


另外经过测试,在导入了DLL的时候,在DLL中创建的类,在EXE中delete 它的(纯)虚基类指针,则EXE会自动找到DLL中该类的operator delete,和析构函数,即使operator delete和析构函数这两个接口在EXE中并没有暴露..OO果然很强大..(还是MSVC compiler强大....?)
但是,析构函数的调用还可以理解,因为虚指针中的vtable中有析构函数的指针,但是operator delete呢?莫非.....


嗯,dector和operator delete不管内部如何实现,或许对OO来说,要求都一样,都是OO的多态必须解决的问题...

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值