如何检查对象从类继承时的类类型

时间:2012-07-18 18:20:35

标签: c++ arrays class object

让我们说我有3个不同的类:装备,武器和工具。武器和工具继承了装备。我创建了一个Weapon或Tool对象并将其添加到Equipment数组中。当我检索对象时,如何编写“IF”语句以检查此对象是否为武器或工具?

由于

5 个答案:

答案 0 :(得分:1)

使用dynamic_cast如下:

Equipment *pMyObj = ... //got it somewhere

Weapon *pWeapon = dynamic_cast<Weapon *>(pMyObj);

if( pWeapon != NULL ){ 
 //you have weapon 
}

答案 1 :(得分:0)

你在谈论RTTI(link)但是如果你在你的装备基类中保留一个'type'枚举可能会更好,然后只需检查它以找出派生类型是什么。然后,您只需将dynamic_cast设备对象转换为正确的派生类型。

答案 2 :(得分:0)

if(dynamic_cast&lt; Weapon *&gt;(Equipment_ptr)!= NULL)//然后武器

答案 3 :(得分:0)

相信typeid是另一种选择..

if (typeid(thing)==typeid(otherthing)){
  //...
}

答案 4 :(得分:0)

虽然我对dynamic_cast感觉有些混乱。

虽然它会起作用,但如果选择的数量增加,它可能不是最佳选择。在这种情况下,我更喜欢“kind” - 枚举和虚拟GetKind()方法。这允许在枚举上有一个很好的switch()语句,如果你忘记列出其中一个枚举值,大多数编译器甚至应该能够发出警告。

由于您已经知道在案例中您正在处理哪个类:部分,您不再需要dynamic_cast,因此您不需要执行相同的检查两次。

当然,请尽量保持你的switch()或if-else-cascades有限;看看为什么需要检查类,并花一两分钟考虑将代码放入虚拟方法中。我不是说从不测试班级类型,但我认为至少应该做出一个有意思的决定: - )