在我的项目中,我有一棵不同类型的 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/