2015-11-24 133 views
2

假設我有一個Animal類和兩個類 - Dog和Cat從它派生。 這是完全合法的做到這一點 -知道哪個派生類的基類指針指向

Dog d; 
Cat c; 
Animal* a1 = &c; 
Animal* a2 = &d; 

現在,由於A1和A2,我可以知道哪個派生類中該指針指向?

我現在唯一的想法是在Animal類中添加一個更多成員字段並在構造函數中初始化它。這是一個很好的做法嗎?

+0

不,這不是好習慣。這通常表明還有更多的想法可以做。 – molbdnilo

回答

4

是的,這是合法的,是的,這是回到原來的類型的一種方式。你也可以使用dynamic_cast,但是它有開銷。通常,程序將其存儲在派生類型中,並且只在與基類無關時引用它。

我發現如果你不得不做類似dynamic_cast的事情,你必須重新考慮你的程序的設計。

1

您可以使用dynamic_cast查找。 Dynamic_cast使用運行時類型檢查,如果無法相應轉換,將會失敗。

ex: Derived* d = dynamic_cast<Derived*>(base) 

此外,如果您使用VStudio,您可以使用 typeid(*a1).name.這會給你的類名由A1指針指向。

+1

typeid不是純粹的Visual Studio事物。 –

+0

是不是假設我知道基類指針的類型? 在我的問題中,我會寫 'Cat * ptr = dynamic_cast a1'或 'Dog * ptr = dynamic_cast a1'? – Sashank

+0

是的。但是由於dynamic_cast是安全的強制轉換(檢查運行時類型信息以確保有意義的轉換可以發生),您可以獲取指向所請求類型的有效指針或null。如果您不知道指向的對象,則使用typeid(* a1).name =「Cat」,typeid(* a1)==「dog」 – Nandu

0

我會建議添加一個字段。

正如其他人所說,dynamic_cast<T>()可以使用,但你需要小心,知道什麼時候會工作,什麼時候不工作。它的工作,你需要RTTI(運行時類型信息),這是並不總是存在/有效

我同意@Dominic麥克唐納(例如使用庫等時):

我覺得如果你必須做一些類似dynamic_cast的事情,你必須重新考慮你的程序的設計。

PS:如果您使用的是Qt,那麼你可以使用qobject_cast<T>()因爲Qt的增加這種類型的信息QObject類型的對象,而不需要RTTI

1

我多米尼克同意。我只是喜歡在這裏添加兩點,dynamic_cast開銷因編譯器不同而不同,如果您沒有重新設計程序的選項,那麼您沒有選擇餘地,但要使用dynamic_cast。(如果情況(不是您的情況有問題的地方)你確定的類型,然後總是喜歡使用static_cast,它的開銷非常小。)

+0

這不會提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/評論/低質量帖/ 10315029) –

+0

@BartłomiejSemańczyk...答案是使用其他人建議的dynamic_cast。 –

相關問題