繼承可以說我有3個不同的類別:設備,武器和工具。武器和工具繼承設備。我創建了一個武器或工具對象並將其添加到設備數組中。當我檢索對象時,如何編寫我的「IF」語句來檢查這個對象是否是武器或工具?如何檢查哪些類類型的對象,當它從一個類
感謝
繼承可以說我有3個不同的類別:設備,武器和工具。武器和工具繼承設備。我創建了一個武器或工具對象並將其添加到設備數組中。當我檢索對象時,如何編寫我的「IF」語句來檢查這個對象是否是武器或工具?如何檢查哪些類類型的對象,當它從一個類
感謝
使用的dynamic_cast如下:
Equipment *pMyObj = ... //got it somewhere
Weapon *pWeapon = dynamic_cast<Weapon *>(pMyObj);
if(pWeapon != NULL){
//you have weapon
}
一個方便的技巧是聲明,如果條件裏面的變量:'如果(Weapon * pWeapon = dynamic_cast(pMyObj)){/ *你有武器* /}' – bames53 2012-07-18 18:27:53
你是對的。謝謝你的訣竅。 – 2012-07-18 18:29:05
你在談論RTTI(link),但是如果你在你的設備的基類保持一個「類型」的枚舉,那麼它可能會更好只要檢查一下,找出派生類型是什麼。然後,你可以dynamic_cast
裝備對象,以正確的派生型。
如果(dynamic_cast的<武器*>(Equipment_ptr)!= NULL)//然後武器
相信typeid的是另一種選擇..
if (typeid(thing)==typeid(otherthing)){
//...
}
我對dynamic_cast的好壞參半的感覺,雖然。
雖然它會工作,它可能不是,如果選擇的數量可以增長的最佳選擇。在這種情況下,我更喜歡「kind」-enumeration和一個虛擬的GetKind()方法。這允許枚舉一個不錯的開關()語句,並且大多數編譯器甚至應該能警告你,如果你忘記列出枚舉值之一。
由於您已經知道在案例中您正在處理的是什麼課程,因此您不需要再進行dynamic_cast,因此您不必再執行相同的檢查。
當然,請儘量保持switch()或if-else-cascades的有限性;看看爲什麼你需要檢查類,花一兩分鐘考慮將代碼置於一個虛擬的方法來代替。我不是說永遠不要測試類的類型,但我認爲至少應該使之成爲Concious酒店決定:-)
'polymorphism'是你的朋友 – triclosan 2012-07-18 18:23:49