为什么Qt会在dynamic_cast
等QObject
层次结构中重新实现自定义RTTI系统和自己QEvent
的重新实现?
答案 0 :(得分:6)
首先,Qt中只有少数几个类层次结构实际上需要RTTI。生成嵌入代码时,可以通过不发出RTTI信息来节省大量代码空间。在构建Qt和使用它的适当编写的项目时,您可以在编译器中关闭RTTI。您不能再使用dynamic_cast
,因此QObject
层次结构具有自己的qobject_cast
,QEvent
使用显式整数类型标记。
QObject
层次结构的自定义RTTI系统还允许从其元数据动态创建类型,以及编译器不知道的新类型的元数据。这就是为什么QML可以工作的原因。在Qt 5中,此功能由私有QMetaObjectBuilder
提供。 legacy way of creating dynamic signals and slots与标准QObject::connect
不兼容。
历史上,一些编译器dynamic_cast
在共享库边界上失败。