一、话不多说直接看代码
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很重要。若果不发生多态就不要加了,避免增加程序负担。
老夫今日就说到这里拜拜了~~~~