2012-08-14 77 views
5

可能重複:
Finding the type of an object in C++檢查,如果指針指向一個特定的類C++

我有檢查指針,看看他們是否符合特定的派生類,並採取一個問題必要的行動。

可以說我目前有2個派生類DerivedClass1DerivedClass2和基類BaseClass。我想檢查以下操作。

Ptr<BaseClass> ptr;

if (ptr points to DerivedClass1) { 動作1 } 其他 { 動作2 }

如何檢查ptr指向一個特定的DerivedClass?

+2

不,很可能你*不想*知道'* ptr'的動態類型是什麼。 – 2012-08-14 11:17:59

回答

10

如果BaseClass是多態(包含虛擬函數),你可以測試:

if (dynamic_cast<DerivedClass1*>(ptr.get())) 

但通常爲開卷暗示,可能是訪問者模式,對於這樣的事情,你應該使用動態調度。亂拋垃圾代碼dynamic_cast使其難以維護。我幾乎從不使用dynamic_cast

20

如果你想多一點的對象orientedly,你只是使它在基類中的虛方法:

Ptr<BaseClass> ptr; 

ptr->Action(); 

並且將每個類實現它需要。我意識到這不是一個真正的答案,但它是實現你的目標的另一種方式,通常認爲它更好,這就是爲什麼我認爲這是值得一提的原因。

+0

謝謝。這是我最初的想法,但我遇到了在特定類中使用const方法而在另一個類中使用非const的問題,因此試圖在新方法中添加此行爲。 – lordlabakdas 2012-08-14 11:27:45

4
if(dynamic_cast<DerivedClass1*>(ptr)) 
{ 
    // Points to DerivedClass1 
} 
else if(dynamic_cast<DerivedClass2*>(ptr) 
{ 
    // Pointes to DerivedClass2 
} 
+0

如果有第三層次,比如說DerivedClass1_1和DerivedClass1_2,那麼第一個if語句會把它們當作DerivedClass1來處理 - 這可能或不可能是OP想要的。 – 2012-08-14 11:40:36

+0

@ Component10我簡單回答了OP的問題。我不會寬恕這種做法,並且通常會發現這只是在_bad設計決定製定時才需要。感謝您指出繼承情況,以防OP決定嘗試這樣的事情。 – Aesthete 2012-08-14 11:45:36