当前位置 : 主页 > 手机开发 > 其它 >

来自QObject的QT pimpl继承

来源:互联网 收集:自由互联 发布时间:2021-06-19
在通过Qt代码时,我有关于pimpl实现的这个基本问题. 以QWidget实现为例. QWidget ---inherits--- QObject | | contains contains | | \ / \ /QWidgetPrivate ---inherits--- QObjectPrivate 现在QWidget有两个QObjectPrivate实例
在通过Qt代码时,我有关于pimpl实现的这个基本问题.
以QWidget实现为例.

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

现在QWidget有两个QObjectPrivate实例(通过继承和通过包含).
为什么以这种方式完成实施?拥有同一个对象的两个实例不是一个开销吗?

实例化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;
    }
}
网友评论