zoukankan      html  css  js  c++  java
  • C++中虚析构函数的作用

       我们知道,用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++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
        所以,文章开头的那个问题的答案就是--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
        当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。

  • 相关阅读:
    链表--判断一个链表是否为回文结构
    矩阵--“之”字形打印矩阵
    二叉树——平衡二叉树,二叉搜索树,完全二叉树
    链表--反转单向和双向链表
    codeforces 490C. Hacking Cypher 解题报告
    codeforces 490B.Queue 解题报告
    BestCoder19 1001.Alexandra and Prime Numbers(hdu 5108) 解题报告
    codeforces 488A. Giga Tower 解题报告
    codeforces 489C.Given Length and Sum of Digits... 解题报告
    codeforces 489B. BerSU Ball 解题报告
  • 原文地址:https://www.cnblogs.com/8586/p/1328113.html
Copyright © 2011-2022 走看看