C++中虚析构函数的作用

原创 2007年10月08日 16:47:00
我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:    
    有下面的两个类:
class ClxBase
{
public:
    ClxBase() {};
    
virtual ~ClxBase() {};

    
virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};

class ClxDerived : public ClxBase
{
public:
    ClxDerived() {};
    
~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; }; 

    
void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
};

    代码

ClxBase *pTest = new ClxDerived;
pTest
->DoSomething();
delete pTest;

    的输出结果是:

Do something in class ClxDerived!
Output from the destructor of class ClxDerived!

    这个很简单,非常好理解。
    但是,如果把类ClxBase析构函数前的virtual去掉,那输出结果就是下面的样子了:

Do something in class ClxDerived!

    也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。我想所有的C++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
    所以,文章开头的那个问题的答案就是--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
    当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。

 

C++中虚析构函数的作用及其原理分析

参考http://blog.csdn.net/xiamentingtao/article/details/55517203 C++中的虚析构函数到底什么时候有用的,什么作用呢。 一.虚析构函数的...
  • derkampf
  • derkampf
  • 2017年03月15日 00:13
  • 1633

基类的纯虚析构函数一定要予以实现

纯虚函数 纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。 虚函数是C++语言的精髓。含有纯...
  • friendbkf
  • friendbkf
  • 2015年05月17日 18:59
  • 1757

C++中虚的私有的析构函数的作用

很简洁的一句话就是,虚是为了
  • lipeng32768
  • lipeng32768
  • 2014年10月25日 08:45
  • 542

虚析构函数的实现原理

虚析构函数的理论前提是执行完子类的析构函数,那么父类的虚构函数必然会被执行。那么当用delete释放一个父类指针所实例化的子类对象时,如果没有定义析构函数,那么将只会调用父类的析构函数,而不会调用子类...
  • qq_23225317
  • qq_23225317
  • 2016年10月14日 22:28
  • 1053

C++ 中 父类的虚 析构函数_legend

     C++  父类虚析构函数  (1)C++虚函数 :  1). C++ 多态 :  将子类对象指针赋值给父类指针,然后通过父类指针来调用  子类中重写的虚函数。  如果在重...
  • legend050709
  • legend050709
  • 2014年05月14日 19:03
  • 1564

关于虚析构函数的作用和使用

作用:作为基类使用的类应该具有虚析构函数,以保证在删除基类指针(动态分配的对象)时,根据指针实际指向的对象进行适当的析构。 请看下面这段代码; #include class A{ publi...
  • wangbin_jxust
  • wangbin_jxust
  • 2014年10月15日 14:59
  • 833

为什么C++不能有虚构造函数,却可以有虚析构函数

class B{ public : virtualvoid m1(); virtualvoid m2(); }; class D : public B{ virtualvoid m...
  • xiaochonghao
  • xiaochonghao
  • 2016年10月15日 12:32
  • 639

关于析构函数和纯虚函数

之前一直不知道,虚析构函数yo
  • guozhengdong
  • guozhengdong
  • 2014年09月29日 22:18
  • 959

C++多态之虚基类析构函数的作用

每个含有虚函数的类中都保存着一个指向虚表的指针,而虚表中保存了该类各个虚函数的地址。 而当子类对象过期时,需要被销毁,如果父类对象没有将析构函数声明为virtual,则在销毁子类对象时,只会调用父...
  • Artprog
  • Artprog
  • 2016年02月24日 21:48
  • 1181

C++类有继承时,析构函数必须为虚函数

虚函数与多态一文中讲了虚函数的用法和要点,但少讲了一点,就是虚函数在析构中的用法,本文就是修复一bug的。C++类有继承时,析构函数必须为虚函数。如果不是虚函数,则使用时可能存在内在泄漏的问题。假设我...
  • luoweifu
  • luoweifu
  • 2016年12月21日 09:24
  • 2250
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中虚析构函数的作用
举报原因:
原因补充:

(最多只允许输入30个字)