在使用多态时,在new和delete时一定要保持原有对象类型,不能在new时就进行强制转换,否则会在析构时出现问题。其他时候可以使用
如下面的例子:
class CBase
{
public: CBase(){_tprintf(_T("class CBase \n"));}
~CBase(){_tprintf(_T("class CBase析构\n"));}
virtual void call(){_tprintf(_T("CBase call!\n"));}
};
class CInherit : public CBase
{
public: CInherit(){_tprintf(_T("class CInherit初始化\n"));}
~CInherit(){_tprintf(_T("class CInherit析构\n"));}
virtual void call(){_tprintf(_T("CInherit call!\n"));}
};
调用方法1
CBase *p_cb=(CBase*)new CInherit();
p_cb->call();
delete p_cb;
输出结果:
class CBase 初始化
class CInherit初始化
CInherit call!
class CBase析构 //少了CInherit类的析构函数,造成不可预知的后果,因为是按照CBase类的指针类型delete的!
调用方法2
CInherit *p_cb=new CInherit();
((CBase*)p_cb)->call();
delete p_cb;
输出结果:
class CBase 初始化
class CInherit初始化
CInherit call!
class CInherit析构
class CBase析构 //结果正确
在使用继承类时,如果要使用多态,最好使用对象指针,不要直接用对象。