从 QObject 继承 QT pimpl

标签 qt inheritance private

在浏览 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/

相关文章:

java - 跨项目的继承和可见性

java - 接口(interface)中没有设置方法

scala - 修改从 Scala 中的方法返回的值(Highcharts lib)

c# - C# 中的私有(private)构造函数

c++ - 制作 QGraphicsPixmapItem 动画的最简单方法?

c++ - avcodec_encode_video2 在 MinGW32 上崩溃(但在 MinGW64 上没有)

node.js - 限制用户访问其他用户内容的最优雅的方法是什么?

typescript - 使用 Jasmine 监视私有(private)变量的属性/函数

c++ - 使用 ccache/clang 编译 Qt 代码时避免多余的警告

c++ - SQL 表事件存储作为 Qt App 中的队列