effective c++ 03 给析构函数加个virtual关键字

一、话不多说直接看代码

class CJackTang{
public:
	CJackTang() = default;
	virtual ~CJackTang(){ cout << "~ CJackTang\n"; };
};

class CJackTangsSon1:public CJackTang{
public:
	~CJackTangsSon1(){ cout << "~ CJackTangsSon1\n"; };
};

class CJackTangsSon2 :public CJackTang{
public:
	~CJackTangsSon2(){ cout << "~ CJackTangsSon2\n"; };
};


CJackTang* GetSon(int x)//获取儿子
{
	CJackTang *pson = NULL;
	switch (x)
	{
	case 1:
		pson = new CJackTangsSon1();
		break;
	case 2:
		pson = new CJackTangsSon2();
		break;
	default:
		pson = NULL;
		break;
	}

	return pson;
}

void play()
{
	CJackTang*pmyson = GetSon(1);
	if (pmyson)
	{
		//...让儿子做些事情
	}


	if (pmyson)
	{
		delete pmyson;//做完之后放掉..........(1)
		pmyson = NULL;//避免野指针
	}	
}

int main()
{	
	play();
	system("pause");
}

注意:接下来让老夫讲解两句,注意看(1)看似没什么问题,其实隐藏一个碗大的bug——资源未释放,这对于软件来说非常致命的;你试图用基类指针(CJackTang)去释放子类(CJackTangsSon1,2),但达不到理想结果,说明多态掌握不够。
其实你给基类的析构函数加个关键字 virtual即可。
现在说说为什么资源未释放?
先看没有加virtual的运行结果:
~ CJackTang
可知子类的析构函数没有执行。
现在看加了virtual结果:
~ CJackTangsSon1
~ CJackTang
如果还不明白为什么会造成资源未释放,你可以点一下右上角的‘X’号。
总结:所以做项目给用户提供接口的时候(前提:发生多态),给基类的析构函数加个关键字virtual很重要。若果不发生多态就不要加了,避免增加程序负担。
老夫今日就说到这里拜拜了~~~~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发如雪-ty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值