QT Pimpl继承自QObject

5

在查看Qt代码时,我对pimpl实现有一个基本的问题。以QWidget实现为例。

QWidget        ---inherits---> QObject
   |                              |
 contains                      contains
   |                              |
  \ /                            \ /
QWidgetPrivate ---inherits---> QObjectPrivate

现在QWidget有两个QObjectPrivate的实例(通过继承和包含)。 为什么要以这种方式实现?拥有同一对象的两个实例不是一种负担吗?
1个回答

4

在实例化 QWidget 时,并不存在两个 QObjectPrivate 的实例。如果你仔细查看 QObject 的头文件,你会注意到一个受保护的构造函数:

protected:
    QObject(QObjectPrivate &dd, QObject *parent = 0);

该语句将QObjectPrivate的实例设置为通过受保护的构造函数传递的实例:

QObject::QObject(QObjectPrivate &dd, QObject *parent)
    : d_ptr(&dd)

这是所有不同的QWidget构造函数调用的构造函数。QWidget构造函数传入一个QWidgetPrivate实例,正如你所注意到的,它是QObjectPrivate的子类。因此,在QWidget中只存在一个QObjectPrivate实例。
下面是说明这一点的默认QWidget构造函数:
QWidget::QWidget(QWidget *parent, Qt::WindowFlags f)
    : QObject(*new QWidgetPrivate, 0), QPaintDevice()
{
    QT_TRY {
        d_func()->init(parent, f);
    } QT_CATCH(...) {
        QWidgetExceptionCleaner::cleanup(this, d_func());
        QT_RETHROW;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接