簡體   English   中英

如何在C ++中確定運行時的實際對象類型;

[英]How to determine actual object type at runtime in C++;

讓我們說我們有一個類層次結構。 在底部我們有Base和頂部Derived。 如何確定對象類,即使它被轉換為基類指針。

Base* b = new Derived():

typeid(b).name(); // i want this to tell me that this is actually derived not base object

有什么方法除了手動實現字符串字段或這樣的虛擬get函數?

PS:我在談論與編譯器無關的解決方案

確保基類至少有一個虛方法,包括<typeinfo>並使用當前代碼和另外的解除引用, typeid(*b).name()


順便提一下,請注意, typeid調用是C ++中的一個地方,您可以在其中取消引用具有明確定義的行為的nullpointer,這意味着它可以拋出異常:

C ++11§5.2.8/ 2
“如果通過將一元*運算符應用於指針並且指針是空指針值(4.10)來獲得glvalue表達式,則typeid表達式將拋出std::bad_typeid異常(18.7.3)。”

如果你想要做的就是找到b實際上是否指向Derived ,只需使用dynamic_cast()

if (dynamic_cast<Derived*>(b)) { ... }

如果b指向的對象的實際運行時類型不是Derived (或派生自Derived的類), dynamic_cast將返回空指針。 std::type_infoname()成員不同,這是編譯器不變的。

請注意,這僅在Base具有至少一個虛擬成員函數時才有效。 無論如何,它應該通過基指針操作從它派生的類型,因此它應該有一個虛擬析構函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM