[英]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_info
的name()
成員不同,這是編譯器不變的。
請注意,這僅在Base
具有至少一個虛擬成員函數時才有效。 無論如何,它應該通過基指針操作從它派生的類型,因此它應該有一個虛擬析構函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.