我想以相同的方式处理特定类(class)的所有 child 。
到目前为止,我一直在检查dynamic_cast
,如下所示:
if(dynamic_cast<ParentClass*>(child_object))
{
// handle the object
}
如果我确实不需要强制转换子对象来使用它,是否有更好的方法?
我的第一次尝试是:
if(std::is_base_of<ParentClass, typeid(child_object)>::value)
这当然不起作用,因为 is_base_of
需要两个 class
参数,而 typeid()
返回 std::类型信息
。
所以我的问题是,这样做的正确方法是什么?或者,即使不使用转换的对象,dynamic_cast
也是正确的工具吗?
更新
这是我想要实现的目标的具体示例。我正在迭代与我感兴趣的对象发生冲突的所有 QGraphicsItem
对象。我只想处理其中一组对象并忽略其余对象。该组对象有一个共同的父对象。那么再次使用dynamic_cast
是可行的方法,还是有更好的替代方案?
for(QGraphicsItem* i : collidingItems())
{
if(dynamic_cast<ParentClass*>(i))
{
// handle specific group of objects that
//are children of ParentClass
}
}
最佳答案
dynamic_cast
是正确的选择。这是检测对象是否是某个类的继承树的一部分的唯一方法,因为 typeid
只会为您提供该类的实际名称。
话虽如此,如果需要对给定类的对象执行特定操作,则它应该是虚拟方法。通常使用 RTTI 是不好的形式,尤其是在这里。
关于c++ - 如何在运行时检查对象是否派生自特定类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31986952/