为什么在定义Q_DECLARE_PRIVATE宏时在实现d_fun()中使用reinterpret_cast

时间:2016-11-09 19:22:39

标签: c++ qt

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

2 个答案:

答案 0 :(得分:4)

原因是:

  1. Qt源代码不支持dynamic_cast,因为可以在关闭RTTI的情况下构建Qt。

    dynamic_cast<字符串出现在非测试,非第三方Qt 5.7.0来源的大约十几个位置,其中大多数都是错误/遗漏。

  2. 宏用于标头Class##Private是前向定义的。 static_cast无法正常工作,因为编译器并不知道Class##Private是从d_ptr的指向类型派生的。

  3. 如果Class##Private未定义,则使用的正确广播代码为static_castdynamic_cast将是一个过早的悲观化,因为宏在编译时已知d_ptr指向类型的位置,尽管不在标题中。

  4. 有关Q_DECLARE_PRIVATE的详细信息,另请参阅How to use the Qt's PIMPL idiom?

答案 1 :(得分:1)

因为dynamic_cast要求类至少有一个virtual方法(它需要是多态的)。只有类继承还不足以使dynamic_cast成功。