c++ - 在知 Prop 体的子类类型时使用 C 风格的向下转换

标签 c++ qt casting downcast

在我的项目中,我有一棵不同类型的 QObject 树。让我给你一个简单的例子,它应该让你明白我在说什么。这可能是一个示例性的 QObject 树(不是继承图,但有点类似于类图),我们从顶部的根对象开始,并在下面列出其子对象:

                                   City
                                     |
                                  Street
                                 /      \
                            House       ...
                           /     \
                       Floor     ...
                       /   \
                   Room    ...

虽然 QObject 树不一定遵循此规则,但在我的例子中,树中的每个类都有一个特定类型的父。因此,以一个关系为例,一个房子可以有一些楼层和其他类型的 child ,但一个楼层是一个房子的 child ,只有一个房子

现在,如果我将它们建模为 QObject 派生类,class Floor 的接口(interface)应该给我它的 House *house()通过内部查看 QObject::parent() 是什么是。我真的知道这个 parent 的类型是 House* ,因为我将它设计成这样,并且程序员坚持这种设计。

如果我用 C 风格转换 QObject *parent() 可以吗?至 House*实现House *house() const

Qt 建议使用 qobject_cast<House*>(parent()) , 返回 0如果QObject* parent()不继承自 House ,使转换类型安全。但是在 Release模式下,我想避免这种缓慢的转换。我介绍了一种特定的算法,在执行 C 风格的强制转换而不是 qobject_casts 时,该算法的执行速度快了三倍。这是因为 qobject_cast 在运行时向元对象询问有关类型信息的信息,导致非常经常调用时速度显着下降。

所以我最终得到的是:

House *Floor::house() const {
    Q_ASSERT(qobject_cast<House*>(parent()));
    return (House*)parent();
}

这将在 Debug模式下断言父级确实是一个 House,而在 Release模式下仅有效地进行 C 风格的转换。

进入正题:我知道当 C++ 程序员进行 C 风格的转换时人们会大喊大叫,但在这种情况下可以吗?

另一种解决方案是将特定类型的父指针另外存储为成员变量,但我认为这是多余的,而且我也喜欢树反射(reflect)在返回树父的那些方法中。

最佳答案

如果您确定所有权图不会更改,即使在维护期间也是如此,那么未进行类型检查的转换是安全的。您可以使用 static_cast<House*>(parent()) ,这很快,或者,如果你真的想要,C 风格的转换也可以。但是 C 风格的转换并不比 C++ 快 static_cast .

关于c++ - 在知 Prop 体的子类类型时使用 C 风格的向下转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12735713/

相关文章:

c++ - 使用 cin.ignore()?不确定如何让它工作

python - 使用 python 将 Qt 与 Windows 7 任务栏集成?

java - 如何解决此 "cannot be cast to"异常?

java - 为什么不推荐从 List<A> 转换为 List<B>?

c++ - 替换链表头的问题

c++ - Qt 将 UTF16 十六进制字符串转换为 QString

C++ 动态分配的二维数组过度分配内存?

c++ - 如何在 Qt 中导出新的基本文件名?

c++ - 控制台应用程序和图形界面之间的交互类型

python - 使用 type() 信息来转换存储为字符串的值