2016-12-19 116 views
3

我已經繼承層次如何檢查的對象是基類

class A{ 
    virtual bool fun() = 0; 
}; 

class B: public A{ 
... 
} 

class C: public B{ 
... 
} 

class D: public C{ 
... 
} 

class E: public B{ 
... 
} 

在主程序中,我執行類似

for(auto pA: ObjVector) 
{ 
    if(pA->fun()){ 
     ... 
    } 
} 

現在我想知道Pa爲包含以下基類B對象。 據我所知2種方式

  1. dynamic_cast所有派生類對象,測試是否所有dynamic_casts失敗 ,只有通過對B我們確信, 對象類型的B

  2. 添加一個接口方法,將返回值類型enumeration 值並標識B對象。

是否有任何其他方法來識別B類?

+1

如果需要知道什麼對象你正在處理你編寫代碼,它更可能你有一個缺陷在你的設計中。 – PaulMcKenzie

+0

我正在解決現有代碼中的問題,這個設計是由客戶給出的,我們不應該改變他的設計。 –

回答

6

您可以使用typeid運算符。例如

if (typeid(*pA) == typeid(B)) { 
    /* ... ptr points to a B ... */ 
} 

這項工作pA只有正是乙

typeid - documentation

+0

謝謝你,讓我測試你的解決方案,我會在這裏更新。我從未在 –

+0

之前使用過typeid,因爲在單個測試中確實匹配的方法得到了我的投票。 – StoryTeller

+0

謝謝!你的解決方案解決了我的問題 –

0

我認爲這是唯一的選擇。

我強烈建議不要使用enum來標識對象類型。它很快導致違反Open/Closed Principle

使用dynamic_cast是好了很多,但它是值得采取強硬看待問題,以確保它是絕對必要的 - 你不能完成你想要使用virtual功能,無論你如何嘗試。