2013-12-11 94 views
0

我想有一個來自相同基類的類的對象的容器。看起來最好的方法是創建一個指向基類的指針容器,並將它們指向派生類對象。然而,我想要檢索的對象並把它傳遞到被重載派生類全局函數:(RESP A,B)有沒有辦法讓派生類的容器在檢索時被識別爲派生類而不是基類?

Class Base {}; 
Class A : public Base {}; 
Class B : public Base {}; 

double MyFunction(const A &a_object) {does things}; 
double MyFunction(const B &b_object) {does different things}; 

typedef boost::shared_ptr<Base> Ptr; 
typedef std::vector<Ptr> PtrContainer; 

int main() 
{ 
    PtrContainer MagicContainer; 

    //Fill MagicContainer with A's and B's 



    double result = MyFunction(*MagicContiner[0]); //Compiler can't resolve 
    //which MyFunction to use 
} 

我知道如果我提出的MyFunction基地虛擬成員函數這會工作,但我想保持全球MyFunction(或可能在一個單獨的類)。我對C++很陌生,因此非常感謝任何幫助。

+1

你可以把專門的行爲放在虛擬方法後面嗎?試圖將非方法函數耦合到這樣的類是不好的設計,並且會導致代碼維護性差。如果可以的話,你真的需要課堂中所有特定於類的行爲。 –

回答

1

添加虛擬成員函數中Base,即不同地實現對於每個派生的類。

如果感覺不對有它Base,可能要添加自Base得到的中間體類,AB然後從派生。

更一般地說,解決這個問題的方法並不是在每個呼叫者站點下垂,而是通過訪問者模式集中在類本身中向下轉換,但對於使用訪問者模式的情況,似乎也是一樣重量級的解決方案:只是一個普通的虛擬功能可能會。