2014-03-07 25 views
0

我有一個函數,我不能輕易更改的函數,它的簽名或調用者可以獲得對結構的引用。這個結構是一個基類,但是根據在這個函數中發現的東西,這個結構被確定爲繼承類型並且像這樣操作。稍後,根據我們在此設置的方式,這些數據將根據情況進行dynamic_cast。作爲派生類有條件地處理/投射基類參考參數並將其返回

struct Base { 
    int baseMember; 
} 

struct Derived : public Base { 
    int derivedMember; 
} 

enum EvtType { 
    EVT_A, 
    EVT_B 
} 

void handleEvent(Base& data) { 
    data.baseMember++; //adjust the common member 

    switch (getEventType()) // some static returning EvtType 
    { 
    case EVT_A: 
     // I can instatiate this as required, setting baseMember in a constructor 
     // or something 
     Derived derivedInst; 

     // and now i can set the derived members as needed 
     derivedInst.derivedMember += 56; // this is just what happens with EVT_As 

     // FIXME: but how do I get this object into the data parameter? 
     break; 
    case EVT_B: 
     // do it differently, but the same idea 
     break; 
    } 
    //handle other event types 
} 

這可能與類似reinterpret_cast,即使輸入參考的對象可能已經被別人爲Base分配呢?

另外,根據在開關的情況下的內容,是有從EvtType建立映射到建立正確的派生類,考慮到我不能擴展DerivedBase班整潔的方式。

+0

所以你基本上是問,如何說'data = derivedInst;'?我不相信這是可能的,除非基類使用類型擦除。 – AlchemicalApples

+1

爲什麼你不能'static_cast (data).derivedMember + = 56'?我不太明白。 – Simple

回答

0

據我所知你實際上需要找出data的真實類型。所以,您可以通過typeid運營商進行檢查。見example。希望這可以幫助。

相關問題