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:04
  • 2893

虚析构函数的实现原理

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

纯虚析构函数必须给出定义

Effective C++ 条歀07:为多态基类声明virtual析构函数(Declare destructors virtual in polymorphic base classes) 纯虚函数...
  • wl1070325332
  • wl1070325332
  • 2017-03-08 17:18:48
  • 442

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

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

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

class B{ public : virtualvoid m1(); virtualvoid m2(); }; class D : public B{ virtualvoid m...
  • xiaochonghao
  • xiaochonghao
  • 2016-10-15 12:32:24
  • 1016

虚析构函数的使用(转载!)

一、当你的类准备给别人继承时要提供虚析构函数考虑下面例子:class A{public: A(){cout  ~A(){cout };class B : publi...
  • cffy625
  • cffy625
  • 2010-01-22 17:21:00
  • 12037

C++学习之多态篇(虚函数和虚析构函数的实现原理--虚函数表)

通过下面的代码来说明: #include #include #include using namespace std; /**  *  定义动物类:Animal  *  成员函数:eat()...
  • hudfang
  • hudfang
  • 2016-01-26 18:13:55
  • 1898

C++中基类的析构函数为什么要用virtual虚析构函数

C++中基类的析构函数为什么要用virtual虚析构函数, 弄清楚为什么。
  • IIcyZhao
  • IIcyZhao
  • 2013-09-22 18:41:19
  • 5591

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

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

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

每个含有虚函数的类中都保存着一个指向虚表的指针,而虚表中保存了该类各个虚函数的地址。 而当子类对象过期时,需要被销毁,如果父类对象没有将析构函数声明为virtual,则在销毁子类对象时,只会调用父...
  • Artprog
  • Artprog
  • 2016-02-24 21:48:58
  • 1394
收藏助手
不良信息举报
您举报文章:C++中虚析构函数的作用
举报原因:
原因补充:

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