假设我有 3 个不同的类别:设备、武器和工具。武器和工具继承装备。我创建了一个 Weapon 或 Tool 对象并将其添加到 Equipment 数组中。当我检索对象时,如何编写“IF”语句来检查该对象是武器还是工具?
谢谢
使用 dynamic_cast 如下:
Equipment *pMyObj = ... //got it somewhere
Weapon *pWeapon = dynamic_cast<Weapon *>(pMyObj);
if( pWeapon != NULL ){
//you have weapon
}
您正在谈论 RTTI ( link ),但是如果您在 Equipment 基类中保留一个“类型”枚举可能会更好,然后只需检查它以找出派生类型是什么。然后,您可以dynamic_cast
将 Equipment 对象设置为正确的派生类型。
if (dynamic_cast< Weapon* >(Equipment_ptr) != NULL) // 然后是 Weapon
相信 typeid 是另一种选择..
if (typeid(thing)==typeid(otherthing)){
//...
}
不过,我对 dynamic_cast 的感觉有些复杂。
虽然它会起作用,但如果选择的数量可以增加,它可能不是最佳选择。在这种情况下,我更喜欢“种类”枚举和虚拟 GetKind() 方法。这允许在枚举上使用一个不错的 switch() 语句,如果您忘记列出枚举值之一,大多数编译器甚至应该能够警告您。
由于您已经知道在 case: 部分中处理的是什么类,因此您不再需要 dynamic_cast,因此您不需要两次进行相同的检查。
Of course, DO try to keep your switch() or if-else-cascades limited; take a look at why you need to check for the class, and spend a minute or two to consider putting the code into a virtual method instead. I'm not saying to never test for the class type, but I think one should at least make it a concious decision :-)