1. 程式人生 > >C++面向物件程式設計中如何判斷一個物件的類型別

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