分享

析构函数为什么要定义成虚析构函数?

 雪柳花明 2016-12-27
    通常,如果想通过指向某个对象基类的指针操纵这个对象(也就是,通过它的一般接口操纵这个对象),会发生什
么现象?当我们用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调用了派生类的析构函数,然后调用
基类的析构函数。这正是我们希望的。不把析构函数设为虚函数是一个隐匿的错误,因为它常常不会对程序有直接影
响。但它会引起内存泄漏(关闭程序时,内存未释放)。同样的析构操作还有可能掩盖发生的问题

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多