如何在运行时检查对象是否派生自特定 class?

How to check if an object is derived from specific class at runtime?

我想以相同的方式处理特定 class 的所有子项。

到目前为止,我一直在检查 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() returns std::type_info.

所以我的问题是,这样做的正确方法是什么?或者 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 是要走的路。这是检测对象是否是某个 class 继承树的一部分的唯一方法,因为 typeid 只会给你 class.[=12= 的实际名称]

话虽如此,如果需要对给定 class 的对象执行特定操作,它应该是虚方法。使用 RTTI 通常是一种糟糕的形式,但在这里尤其如此。