为什么Qt要费心在QObject
层次结构中重新实现自定义RTTI系统和自己的dynamic_cast
,QEvent
等?
首先,Qt中只有少数类层次结构真正需要RTTI。当您生成嵌入式代码时,您可以通过不发出 RTTI 信息来节省一大堆代码空间。在构建Qt并适当编写使用它的项目时,您可以在编译器中关闭RTTI。您不能再使用dynamic_cast
,因此QObject
层次结构有自己的qobject_cast
,并且QEvent
使用显式整数类型标记。
用于层次结构QObject
自定义 RTTI 系统还允许从类型的元数据以及编译器不知道的新类型的元数据动态创建类型。例如,这就是QML可以工作的原因。在Qt 5中,此功能由私有QMetaObjectBuilder
提供。创建动态信号和插槽的传统方式与标准QObject::connect
不兼容。
从历史上看,某些编译器dynamic_cast
跨共享库边界失败。