2011-10-27 60 views
3

的I型有一個C++應用程序,其具有以下類:從AAA C++獲得對象

  • class CCC繼承

    • class AAA
    • class BBB繼承AAA
    • class DDD繼承CCC

    (所有的類都被標記爲public

    現在我有以下地圖:

    map <DWORD, AAA*> 
    

    我發現在mapAAA對象,由DWORD id,但現在我想知道是AAA類型:

    這將是邏輯:

    if(AAA is BBB) 
    { 
    ... 
    } 
    if(AAA is CCC) 
    { 
    ... 
    } 
    if(AAA is DDD) 
    { 
    ... 
    } 
    

    你知道如何用C++編寫它(不需要添加多態函數getType())嗎?

  • +1

    爲什麼你需要知道類型? – Johnsyweb

    +4

    爲什麼需要?如果你的類是多態的,那麼編譯器會爲你做其餘的事情。 – DumbCoder

    回答

    4

    如果您的對象是多態的(即至少有一個虛擬功能),請執行dynamic_cast<T*>

    如果結果不是NULL那麼你有一個T類型的對象。但是一個虛擬功能將會是更好的去IMO的方式。

    注:RTTI將需要enabled on your compiler(它會在絕大多數情況)

    編輯:感謝@Als和@flipchart用於補充

    +1

    'dynamic_cast'僅適用於多態類。 'typeid()'也是如此,這可能會給非多態層次結構帶來錯誤的結果。 –

    +0

    dynamic_cast指針將返回null。在引用上,它會拋出一個異常。另請注意,這需要運行時間類型標識(RTTI) – flipchart

    7

    需要這表明你正在做它錯誤的方法。您正試圖複製虛擬方法的發明。只需在你的基類中添加一個虛擬方法。

    class AAA 
    { 
    public: 
        virtual void DoSomething() = 0; 
    } 
    
    class BBB : public AAA 
    { 
    public: 
        void DoSomething() { ... } 
    } 
    
    class CCC : public AAA 
    { 
    public: 
        void DoSomething() { ... } 
    } 
    
    class DDD : public AAA 
    { 
    public: 
        void DoSomething() { ... } 
    } 
    

    而在你的調用代碼,你的邏輯很簡單:

    // no need for if() blocks. it's the point of virtual methods. 
    AAA* somePointer; 
    ... 
    somePointer->DoSomething(); 
    

    我知道你也許不能只是複製/粘貼您當前的「DoSomething的」代碼到這一點。但這是你應該用於這種情況的模式。也許而不是DoSomething這樣做更有意義,像GetSomeInfo這樣的東西,調用者可以用它來做任何需要做的事情。這種模式的具體用法取決於你的上下文。