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

时间:2015-08-13 11:29:44

标签: c++ c++11 std typeid

我想以同样的方式处理特定班级的所有孩子。

到目前为止,我一直在检查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::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
        }
    }

1 个答案:

答案 0 :(得分:5)

dynamic_cast是要走的路。这是检测对象是否属于某个类的继承树的唯一方法,因为typeid只会为您提供该类的实际名称。

话虽如此,如果需要对给定类的对象进行特定的操作,它应该是一个虚方法。使用RTTI通常是不好的形式,但特别是在这里。