C++类有继承时,析构函数必须为虚函数。如果不是虚函数,则使用时可能存在内在泄漏的问题。
假设我们有这样一种继承关系:

如果我们以这种方式创建对象:
1SubClass* pObj = new SubClass(); 2delete pObj;
不管析构函数是否是虚函数(即是否加virtual关键词),delete时基类和子类都会被释放;
如果我们以这种方式创建对象:
-
若析构函数是虚函数(即加上virtual关键词),delete时基类和子类都会被释放;
-
若析构函数不是虚函数(即不加virtual关键词),delete时只释放基类,不释放子类;
-
测试代码
大家可以自己测试一下,以下是我的测试代码:
1#include <string> 2#include <iostream> 3 4class BaseClass 5{ 6public: 7 BaseClass() 8 : m_pValue(NULL) 9 { 10 } 11 12 /*virtual */~BaseClass() 13 { 14 delete m_pValue; 15 m_pValue = NULL; 16 std::cout << "BaseClass virtual construct." << std::endl; 17 } 18 19 void SetValue(int v) 20 { 21 if (!m_pValue) 22 { 23 m_pValue = new int(v); 24 } 25 else 26 { 27 *m_pValue = v; 28 } 29 } 30 31private: 32 int* m_pValue; 33}; 34 35class SubClass : public BaseClass 36{ 37public: 38 SubClass() 39 : BaseClass() 40 , m_pstrName(NULL) 41 { 42 } 43 44 /*virtual */~SubClass() 45 { 46 delete m_pstrName; 47 m_pstrName = NULL; 48 std::cout << "SubClass virtual construct." << std::endl; 49 } 50 51 void SetName(const std::string& name) 52 { 53 if (!m_pstrName) 54 { 55 m_pstrName = new std::string(name); 56 } 57 else 58 { 59 *m_pstrName = std::string(name); 60 } 61 } 62 63private: 64 std::string* m_pstrName; 65}; 66 67 68int main() 69{ 70 BaseClass* pObj = new SubClass(); 71 pObj->SetValue(10); 72 ((SubClass*)pObj)->SetName("zhangsan"); 73 delete pObj; 74 pObj = NULL; 75 return 0; 76}原文地址:https://blog.csdn.net/luoweifu/article/details/53780438