zoukankan      html  css  js  c++  java
  • C++类有继承时,析构函数必须为虚函数

    C++类有继承时,析构函数必须为虚函数。如果不是虚函数,则使用时可能存在内在泄漏的问题。

    假设我们有这样一种继承关系:

    如果我们以这种方式创建对象:

    SubClass* pObj = new SubClass();
    delete pObj;

    不管析构函数是否是虚函数(即是否加virtual关键词),delete时基类和子类都会被释放;

    如果我们以这种方式创建对象:

    • 若析构函数是虚函数(即加上virtual关键词),delete时基类和子类都会被释放;
    • 若析构函数不是虚函数(即不加virtual关键词),delete时只释放基类,不释放子类;
    • 测试代码

      大家可以自己测试一下,以下是我的测试代码:

      #include <string>
      #include <iostream>
      
      class BaseClass
      {
      public:
          BaseClass()
              : m_pValue(NULL)
          {
          }
      
          /*virtual */~BaseClass()
          {
              delete m_pValue;
              m_pValue = NULL;
              std::cout << "BaseClass virtual construct." << std::endl;
          }
      
          void SetValue(int v)
          {
              if (!m_pValue)
              {
                  m_pValue = new int(v);
              }
              else
              {
                  *m_pValue = v;
              }
          }
      
      private:
          int* m_pValue;
      };
      
      class SubClass : public BaseClass
      {
      public:
          SubClass()
              : BaseClass()
              , m_pstrName(NULL)
          {
          }
      
          /*virtual */~SubClass()
          {
              delete m_pstrName;
              m_pstrName = NULL;
              std::cout << "SubClass virtual construct." << std::endl;
          }
      
          void SetName(const std::string& name)
          {
              if (!m_pstrName)
              {
                  m_pstrName = new std::string(name);
              }
              else
              {
                  *m_pstrName = std::string(name);
              }
          }
      
      private:
          std::string* m_pstrName;
      };
      
      
      int main()
      {
          BaseClass* pObj = new SubClass();
          pObj->SetValue(10);
          ((SubClass*)pObj)->SetName("zhangsan");
          delete pObj;
          pObj = NULL;
          return 0;
      }

      原文地址:https://blog.csdn.net/luoweifu/article/details/53780438

  • 相关阅读:
    BZOJ3562 : [SHOI2014]神奇化合物
    BZOJ3559 : [Ctsc2014]图的分割
    BZOJ3551 : [ONTAK2010]Peaks加强版
    BZOJ3542:DZY Loves March
    李洪强iOS开发之
    iOS学习之iOS沙盒(sandbox)机制和文件操作1
    iOS学习之iOS沙盒(sandbox)机制和文件操作
    stringByAppendingPathComponent和stringByAppendingString 的区别
    iOS开发:Toast for iPhone
    深度解析开发项目之 01
  • 原文地址:https://www.cnblogs.com/rednodel/p/9303238.html
Copyright © 2011-2022 走看看