打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
析构函数为什么要定义成虚析构函数?
    通常,如果想通过指向某个对象基类的指针操纵这个对象(也就是,通过它的一般接口操纵这个对象),会发生什
么现象?当我们用delete用new创建的对象指针时,就会出现这个问题。如果这个指针是指向基类的,在delete期间,编
译器只能知道调用这个析构函数的基类版本。虚函数被创建恰恰是为了解决同样的问题。(除了构造函数以外的所有
函数都可以是虚函数,析构函数可以是虚函数,构造函数不能是虚函数)。
  1. <span style="font-size:18px;">#include<iostream>  
  2. using namespace std;  
  3.   
  4. class Base1  
  5. {  
  6. public:  
  7.     ~Base1(){cout<<"~Base1()"<<endl;}  
  8. };  
  9.   
  10. class Derived1:public Base1  
  11. {  
  12. public:  
  13.     ~Derived1(){cout<<"~Derived1"<<endl;}  
  14. };  
  15.   
  16.   
  17. class Base2  
  18. {  
  19. public:  
  20.      virtual ~Base2(){cout<<"Base2()"<<endl;} //虚析构函数;  
  21. };  
  22.   
  23.   
  24. class Derived2:public Base2  
  25. {  
  26. public:  
  27.     ~Derived2(){cout<<"Derived2()"<<endl;}  
  28. };  
  29.   
  30. void main()  
  31. {  
  32.     Base1 *bp=new Derived1;  
  33.     delete bp;  
  34.     Base2 *b2p=new Derived2;  
  35.     delete b2p;  
  36. }</span>  

    当运行这个程序,将会看到delete bp只调用了基类的析构函数,delete b2p调用了派生类的析构函数,然后调用
基类的析构函数。这正是我们希望的。不把析构函数设为虚函数是一个隐匿的错误,因为它常常不会对程序有直接影
响。但它会引起内存泄漏(关闭程序时,内存未释放)。同样的析构操作还有可能掩盖发生的问题
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
抽象类 虚析构函数 纯虚析构函数
虚析构函数的使用(转载!)
C++之虚析构函数的必要性
覆盖(重写) vs 重载 vs 重定义
基类与派生类中的静态函数地址
C++Virtual详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服