C++面向物件程式設計中如何判斷一個物件的類型別
在C++面向物件程式設計中,有時候需要判斷某個物件的類型別,那麼可以有下列兩種方法:
方法1: 採用 typeid()函式進行判斷:(缺點:當存在繼承,並且子類指標賦值給父類指標時,此時判斷的物件型別為父型別,而不是子類型別)
對於一個父類CFather,其有兩個子類CChildOne,CChildTwo。那麼如何判斷一個物件的類型別。如:
CChildOne objChildOne;
ChildTwo* pChildTwo;
if(typeid(objChildOne) ==typeid(CChildOne))
{
Cout<<”該物件的類型別為CChildOne”<<endl;
}
if(typeid(*pChildTwo) ==typeid(CChildTow))
{
Cout<<”該物件的型別為CChildTwo”<<endl;
}
但是這種方法好像存在問題:如CFirstChild類是CSuper的子類:
CFirstChild* pChild = new CFirstChild("米蘭");
if(typeid(*pChild) ==typeid(CFirstChild))
{
cout<<"CFirstChild"<<endl; //此處是子類物件,沒問題
}
CSuper*pObj = pChild; //此處變成了父類物件,不是子類物件了
if(typeid(*pObj) == typeid(CSuper))
{
cout<<"CSuper"<<endl; //所以執行該條件
}
if(typeid(*pObj) == typeid(CFirstChild))
{
cout<<"CFirstChild"<<endl;
}
CSuper*pObj2 = new CFirstChild("國米");//此處變成了父類物件,不是子類物件了
if(typeid(*pObj2) == typeid(CSuper))
{
cout<<"CSuper"<<endl; //所以執行該條件
}
if(typeid(*pObj2) == typeid(CFirstChild))
{
cout<<"CFirstChild"<<endl;
}
delete pChild;
delete pObj2;
方法2:最好的方法是定義虛擬函式返回類型別
在執行時型別識別,最簡單的辦法就是所有的類(父類和子類)實現一個虛方法返回類名字,根據返回類名字再利用typeid()進行判斷。如:
定義國家父類CCounty,
其中virtual CCounty* GetClassType(void);返回其類型別:
CCounty* CCounty::GetClassType(void)
{
return this;
}
定義子類:CUSA,同時實現虛擬函式virtual CUSA*GetClassType(void);
CUSA* CUSA::GetClassType(void)
{
return this;
}
定義子類:CIraq,同時實現虛擬函式virtual CIraq*GetClassType(void);
CIraq* CIraq::GetClassType(void)
{
return this;
}
這樣在使用的時候直接呼叫該虛擬函式GetClassType()就可以返回相應的類名稱,採用typeid()就可以判斷其相應的型別了。如:
CCounty* pCounty = new CUSA();
if(typeid(*(pCounty->GetClassType()))== typeid(CUSA))//此處是子型別CUSA
而:
CCounty* pCounty = new CIraq();
if(typeid(*(pCounty->GetClassType()))== typeid(CIraq))//此處是子型別CIraq