[英]How to find out what type of object a pointer points to in C++?
假設我有class SuperClass { public: int a; }
class SuperClass { public: int a; }
和class SubClass : SuperClass { public: int b; }
class SubClass : SuperClass { public: int b; }
,我把一個指向子類的實例SubClass *subPointer
並解決該指針超類指針SuperClass *superPointer = subPointer
。 當然,我總是可以將superPointer
對象superPointer
轉換為SubClass的指針,因為它存儲的唯一內容是地址。 但是我怎么知道對象superPointer
是指向SubClass的實例還是只是一個SuperClass指針?
您通常不希望為此使用typeid
。
您通常希望使用dynamic_cast
:
if (SubClass *p = dynamic_cast<SubClass *>(SuperClassPtr))
// If we get here (the `if` succeeds) it was pointing to an object of
// the derived class and `p` is now pointing at that derived object.
雖然有幾個筆記。 首先,你需要在基類中至少有一個虛函數才能工作(但是如果它沒有虛函數,你為什么要從它繼承呢?)
其次,想要這一點往往往往表明代碼的設計問題。 在大多數情況下,您希望在基類中定義一個虛函數,您可以(如果需要)在派生類中重寫以執行任何操作,因此您可以在整個過程中使用指向基類的指針。
最后,就目前而言,大多數轉換都會失敗 - 您使用了默認(私有)繼承,這可以防止從您通常期望看到的derived *
到base *
的隱式轉換(您可能想要class SubClass : public SuperClass
)。
使用RTTI機制。 喜歡:
if(typeid(*superPointer) == typeid(SuperClass)) superPointer->dosomething();
if(typeid(*superPointer) == typeid(SubClass)) superPointer->dosomethingelse();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.