【问题标题】:Is 'implicit sharing' heritable from Qt classes?'隐式共享'可以从 Qt 类继承吗?
【发布时间】:2014-11-09 07:09:22
【问题描述】:

如果我创建一个隐式共享的 Qt 类(例如 QList)的子类,我的子类也会被隐式共享吗?

我阅读了 QtCore5.3 文档中的brief introduction to implicit sharing,但没有看到任何提及可遗传性的内容。

我问的目的是在决定传递哪些参数以及如何传递它们时尝试编写更有效的代码。

【问题讨论】:

  • 请注意 QList 没有虚拟析构函数,因此不应用作(公共)基类。如果这样做很容易遇到UB问题。
  • 在这种情况下,最好使用聚合而不是相互继承。

标签: c++ qt copy-on-write qshareddata


【解决方案1】:

正如 cmets 中所说,使用 implicit-sharing 的 Qt 类通常是数据容器或工具,并不打算成为子类。
你可以注意到,因为没有虚析构函数,实际上根本就没有虚函数。

由于存在风险和不良做法,您可能希望在没有继承的情况下进行不同的设计。


回答你的问题:

隐式共享是如何工作的?
类实例共享数据,并通过调用detach() 函数明确告知何时需要修改此数据(因此,对其进行深度复制)。
所以母类数据仍然是一个共享的数据指针,母类方法仍然会在适当的时候分离。 但是您的子类数据成员将隐式共享,并且您的子类方法将在可能需要时隐式分离。
您还可能会重载方法而忘记分离,从而弄乱共享数据。

您确实没有从隐式共享中受益,您必须为自己的数据再次显式设置它。
您需要将数据封装在共享数据容器中,并在您的方法中管理detach。检查文档:
http://doc.qt.io/qt-5/qshareddatapointer.html#details

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多