如何在运行时检查对象是否派生自特定 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 通常是一种糟糕的形式,但在这里尤其如此。
我想以相同的方式处理特定 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 通常是一种糟糕的形式,但在这里尤其如此。