我想以同样的方式处理特定班级的所有孩子。
到目前为止,我一直在检查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
}
}
答案 0 :(得分:5)
dynamic_cast
是要走的路。这是检测对象是否属于某个类的继承树的唯一方法,因为typeid
只会为您提供该类的实际名称。
话虽如此,如果需要对给定类的对象进行特定的操作,它应该是一个虚方法。使用RTTI通常是不好的形式,但特别是在这里。