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

标签 c++ c++11 std typeid

我想以相同的方式处理特定类(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/

相关文章:

c++ - 复数赋值

c++ - C动态成员结构

c++ - 矩阵运算符重载不起作用

c++ - 你如何正确地将 "snap"设为一个值?

c++ - 为什么我的shared_ptr会泄漏内存?

c++ - 如何从捕获移动的lambda表达式中创建std::function?

c++ - OpenCV 将相同的图像放入容器中

c++ - 为什么 `sqlpp-mysql` 没有正确链接?

c++ - 将字符串转换为 size_t

c++ - VS2012 C++ - 防止 Visual Studio 自动添加包含