Qt 类在公共(public)类中有一个 Q_DECLARE_PRIVATE
宏。宏内容如下:
#define Q_DECLARE_PRIVATE(Class)\
inline Class##Private* d_func() {\
return reinterpret_cast<Class##Private*>(qGetPtrHelper(d_ptr));\
}\
inline const Class##Private d_func() const {\
return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr));\
}\
friend class Class##Private;
这里,根据我的理解 Class##Private
将是 d_ptr
类的父级,那么为什么使用 reinterpret_cast
而不是 dynamic_cast
?
最佳答案
原因是:
A
dynamic_cast
Qt 源代码不支持,因为可以在关闭 RTTI 的情况下构建 Qt。dynamic_cast<
字符串出现在非测试、非第三方 Qt 5.7.0 源代码中的大约十几个位置,其中大多数本质上是错误/遗漏。该宏用于
Class##Private
的 header 中是前向定义的。一个static_cast
不会工作,因为编译器不知道Class##Private
派生自d_ptr
的指向类型.如果
Class##Private
不是前向定义的,那么要使用的正确转换将是static_cast
。一个dynamic_cast
这将是一个过早的悲观,因为该宏用在d_ptr
的地方。的指向类型在编译时是已知的,尽管不在 header 中。
有关Q_DECLARE_PRIVATE
的更多详细信息,另见How to use the Qt's PIMPL idiom? .
关于c++ - 为什么在定义 Q_DECLARE_PRIVATE 宏时在实现 d_fun() 中使用reinterpret_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40514481/