假設我有一個Animal類和兩個類 - Dog和Cat從它派生。 這是完全合法的做到這一點 -知道哪個派生類的基類指針指向
Dog d;
Cat c;
Animal* a1 = &c;
Animal* a2 = &d;
現在,由於A1和A2,我可以知道哪個派生類中該指針指向?
我現在唯一的想法是在Animal類中添加一個更多成員字段並在構造函數中初始化它。這是一個很好的做法嗎?
假設我有一個Animal類和兩個類 - Dog和Cat從它派生。 這是完全合法的做到這一點 -知道哪個派生類的基類指針指向
Dog d;
Cat c;
Animal* a1 = &c;
Animal* a2 = &d;
現在,由於A1和A2,我可以知道哪個派生類中該指針指向?
我現在唯一的想法是在Animal類中添加一個更多成員字段並在構造函數中初始化它。這是一個很好的做法嗎?
是的,這是合法的,是的,這是回到原來的類型的一種方式。你也可以使用dynamic_cast,但是它有開銷。通常,程序將其存儲在派生類型中,並且只在與基類無關時引用它。
我發現如果你不得不做類似dynamic_cast的事情,你必須重新考慮你的程序的設計。
您可以使用dynamic_cast查找。 Dynamic_cast使用運行時類型檢查,如果無法相應轉換,將會失敗。
ex: Derived* d = dynamic_cast<Derived*>(base)
此外,如果您使用VStudio,您可以使用 typeid(*a1).name.
這會給你的類名由A1指針指向。
我會建議添加一個字段。
正如其他人所說,dynamic_cast<T>()
可以使用,但你需要小心,知道什麼時候會工作,什麼時候不工作。它的工作,你需要RTTI(運行時類型信息),這是並不總是存在/有效
我同意@Dominic麥克唐納(例如使用庫等時):
我覺得如果你必須做一些類似dynamic_cast的事情,你必須重新考慮你的程序的設計。
PS:如果您使用的是Qt,那麼你可以使用qobject_cast<T>()
因爲Qt的增加這種類型的信息QObject
類型的對象,而不需要RTTI
我多米尼克同意。我只是喜歡在這裏添加兩點,dynamic_cast
開銷因編譯器不同而不同,如果您沒有重新設計程序的選項,那麼您沒有選擇餘地,但要使用dynamic_cast
。(如果情況(不是您的情況有問題的地方)你確定的類型,然後總是喜歡使用static_cast
,它的開銷非常小。)
這不會提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/評論/低質量帖/ 10315029) –
@BartłomiejSemańczyk...答案是使用其他人建議的dynamic_cast。 –
不,這不是好習慣。這通常表明還有更多的想法可以做。 – molbdnilo