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

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

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

虚析构函数的理论前提是执行完子类的析构函数,那么父类的虚构函数必然会被执行。那么当用delete释放一个父类指针所实例化的子类对象时,如果没有定义虚析构函数,那么将只会调用父类的析构函数,而不会调用子类的虚构函数,导致内存的泄漏。故: 继承时,要养成的一个好习惯就是,基类析构函数中,加上virtual。知识背景     

C++primer学习笔记(六)

1.virtual函数是基类希望派生类重新定义的函数,希望派生类继承的函数不能为虚函数。根类一般要定义虚析构函数。2.派生类只能通过派生类对象访问protected成员,不能用基类对象访问。基类定义为virtual就一直为虚函数,派生类写不写virtual都是虚函数。用做基类的类必须是已定义的。3.存在虚函数指针或引用

C++基类的析构函数定义为虚函数的原因

1:每个析构函数只会清理自己的成员(成员函数前没有virtual)。2:可能是基类的指针指向派生类的对象,当析构一个指向派生类的成员的基类指针,这时程序不知道这么办,可能会造成内存的泄露,因此此时基类的析构函数要定义为虚函数;基类指针可以指向派生类的对象(多态),如果删除该指针delete\\p,就会调用该指针指向的派生类的析构函数,而派生类