Qt类在公共类中有一个True
True
False
False
False
宏。宏读取:
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
?
答案 0 :(得分:4)
原因是:
Qt源代码不支持dynamic_cast
,因为可以在关闭RTTI的情况下构建Qt。
dynamic_cast<
字符串出现在非测试,非第三方Qt 5.7.0来源的大约十几个位置,其中大多数都是错误/遗漏。
宏用于标头Class##Private
是前向定义的。 static_cast
无法正常工作,因为编译器并不知道Class##Private
是从d_ptr
的指向类型派生的。
如果Class##Private
未定义,则使用的正确广播代码为static_cast
。 dynamic_cast
将是一个过早的悲观化,因为宏在编译时已知d_ptr
指向类型的位置,尽管不在标题中。
有关Q_DECLARE_PRIVATE
的详细信息,另请参阅How to use the Qt's PIMPL idiom?。
答案 1 :(得分:1)
因为dynamic_cast
要求类至少有一个virtual
方法(它需要是多态的)。只有类继承还不足以使dynamic_cast
成功。