2017-06-15 51 views
-2

我有這樣的結構:不知道我有什麼類型的類後做一個<的dynamic_cast>

class IIterator : public ICollectible{}; 
class A: public ICollectible{}; 
class b: public A{}; 
class c: public A{}; 
class d: public A{}; 

當我做這樣的事情

IIterator* it = colection->getIterator(); 
whatType* db = dynamic_cast<whatType*>(it->hasCurrent()); 

保藏的清單,A類型的元素(它可能有b,c,cdhasCurrent()hasCurrent()給我東西類型ICollectible,所以我必須做

動態演員,所以我可以工作 與b,cd,但我怎麼知道它是哪一個?

+3

如果你需要知道他們的真實類型是什麼,那麼混合你的類型有什麼意義? – Stargateur

+1

歡迎來到堆棧溢出。請花些時間閱讀[The Tour](http://stackoverflow.com/tour),並參閱[幫助中心](http://stackoverflow.com/help/asking)中的資料,瞭解您可以在這裏問。 –

+0

我會保留3個不同的A類東西的列表? –

回答

2

dynamic_cast的要點是,它告訴你,如果你有正確的類型,或者它返回nullptr。所以,你可以這樣做:

if (b *p = dynamic_cast<b *>(it->hasCurrent())) { 
    // its b 
} else if (c *p = dynamic_cast<c *>(it->hasCurrent())) { 
    // its c 
} else if (d *p = dynamic_cast<d *>(it->hasCurrent())) { 
    // its d 
} else { 
    // none of the above 

當然,很多純粹主義者OO會認爲這是一個「壞的代碼味道」 - 你應該在你的接口類定義一個虛函數和調用,而不是測試不同的派生類型。

+0

我這樣做,但似乎很可怕,以爲有另一種方式 –

+0

@MarcosAyala,另一種方式是使用多態性。通過'std :: function',虛擬調度甚至函數指針。 –

相關問題