C++中为什么有时基类的析构函数必须写为虚函数

C++中为什么有时基类的析构函数必须写为虚函数

    说到虚函数之前,先简单解释一下多态,我的这篇博文:http://blog.csdn.net/zcyzsy/article/details/52463355  里有很详细的解释多态,这里简单说下:

不同对象调用相同名称的成员函数时,可能引起不同的行为(即执行不同的代码)。这种现象称为多态性。将函数调用连接相应函数体的代码的过程称为函数联编(简称联编)。C++中根据联编时刻不同,分为静态联编和动态联编。

 

静态联遍:不同的类可以有相同名称的成员函数,编译器在编译时对他们进行函数联编,这种在编译时刻进行的联编称为静态联编。静态联编所支持的多态性就是编译时多态性(也称编译期多态性、静态多态性)。函数重载和运算符重载就属于编译时多态性。

 

动态联编:在动态联编中,在程序运行时才能确定调用哪个函数。这种在运行时的函数联编称为动态联编。动态联编所支持的多态性就是运行时多态性(也称运行期多态性、动态多态性)C++中,只有虚函数才可能是动态联编的。可以通过定义类的虚函数和创建派生类,然后在派生类中重新实现虚函数,实现具有运行时的多态性。

   综上,知道虚函数的作用了,那么为什么析构函数有时要声明为虚函数?

编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。所以通常是将析构函数声明为虚函数。一个基类的函数一旦声明为虚函数,那么不管你是否加上virtual修饰符,它在所有派生类中都成为虚函数。但是由于理解明确起见最好还是加上virtual修饰符。      

     

简言之:在实现多态时,当用基类指针操作派生类对象时,在析构时防止只析构基类而不析构派生类的状况发生,因此将基类的析构函数声明为虚函数。

 

测试代码如下:

1

#include<iostream>
using namespace std;
class BaseClass
{
publi
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值