为什么Qt在qobject_cast,事件类型等中重新实现RTTI?

Rei*_*ica 2 qt metaobject

为什么Qt会dynamic_castQObject层次结构QEvent等中重新实现自定义RTTI系统和自己的系统?

Rei*_*ica 6

首先,Qt中只有少数几个类层次结构实际上需要RTTI.生成嵌入代码时,可以通过不发出RTTI信息来节省大量代码空间.在构建Qt和使用它的适当编写的项目时,您可以在编译器中关闭RTTI.您不能再使用dynamic_cast,因此QObject层次结构有自己的qobject_cast,并QEvent使用显式整数类型标记.

用于QObject层次结构的自定义RTTI系统还允许从其元数据动态创建类型,以及编译器不知道的新类型的元数据.这就是为什么QML可以工作的原因.在Qt 5中,此功能由私有提供QMetaObjectBuilder.创建动态信号和插槽传统方法与标准不兼容QObject::connect.

从历史上看,有些编译器dynamic_cast在共享库边界上失败了.