在浏览 Qt 代码时,我有一个关于 pimpl 实现的基本问题。
以 QWidget 实现为例。
QWidget ---inherits---> QObject
| |
contains contains
| |
\ / \ /
QWidgetPrivate ---inherits---> QObjectPrivate
现在 QWidget 有两个 QObjectPrivate 实例(通过继承和通过包含)。
为什么以这种方式执行?拥有同一个对象的两个实例不是开销吗?
最佳答案
没有 QObjectPrivate
的两个实例实例化 QWidget
时.如果你仔细查看 QObject
的头文件,你会注意到一个 protected 构造函数:
protected:
QObject(QObjectPrivate &dd, QObject *parent = 0);
它将 QObjectPrivate 的实例设置为通过 protected 构造函数传入的实例:
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;
}
}
关于从 QObject 继承 QT pimpl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6513629/