CSDN=>FAQ=>FAQ 展示
  • 问题内容:为何C++中类的析构函数有时设计成virtual?
  • 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5242268
  • 所属论坛:新手乐园     审核组:C/C++
  • 提问者:guangyao842     解决者:ReverseEngineering
  • 感谢:studying HolyFly ReverseEngineering cmail DonaldKnuth web518 rongcanf sunman1982 xvbn_2003 eqxu realrukawa web518 akirya HappyTree
  • 关键字:函数 调用 C/C++ 指针 新手乐园 指向 对象 派生 恶心
  • 答案:

    当子类的对象转化父类对象时,如果析构函数不是虚函数,则会执行父类的析构函数。则可能造成该对象(主要是子类对象特有的资源)不能被释放,造成资源泄漏。

    如:class Base;

    Class Deriver: public Base

    {

    …;

    }

     

    Base *pb = new Deriver;

    Delete pb;              //子类中含有需要释放的资源时,

    //如果没有声明virtual ~Base();则会造成资源泄漏.


    在代码设计的时候,如果派生类有自己在heap中申请的空间,而且会用到派生类向基类的转化,那么一定要声明虚析构函数。若果没有同时满足上述两个条件,则不要声明虚析构函数(申明虚析构函数和申明虚成员函数一样,都会占用一个virtual pointer)。

    在代码设计的过程中,最好是显式的同时声明基类和派生类的析构函数为虚函数。

    确保使用使用指向派生类对象的基类指针释放派生类对象的内存空间时,
    派生类的析构函数可以正常的调用。

    就是所谓的多态吧

    如果你用基类的指针指向一个派生类对象。再删除这个对象的时候,只会执行基类的析构函数而不会执行派生类的析构。只有把基类的析构设为虚函数的时候才会执行派生类的析构。

    如果需要从基类来删除对象的话,对象的析构函数需要为virtual

  • 评价: 有价值 给朵鲜花(4) 无价值 扔个鸡蛋(0)
相关FAQ
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo