为什么Qt会在qobject_cast、事件类型等方面重新实现RTTI?



为什么Qt要费心在QObject层次结构中重新实现自定义RTTI系统和自己的dynamic_castQEvent等?

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

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

从历史上看,某些编译器dynamic_cast跨共享库边界失败。

最新更新