【问题标题】:Closest solution to multiple inheritance through QObject subclasses通过 QObject 子类实现多重继承的最接近解决方案
【发布时间】:2023-03-27 05:22:01
【问题描述】:

我有多个 QObject 子类,它们应该充当接口类并由其他一些类实现(由继承)。例如让class A : virtual public QObjectclass B : virtual public QObject 成为接口类。我需要一个QDialog 对象来实现它们的行为,例如:class X: public QDialog, A, B

不幸的是,我在设计时没有仔细阅读文档,现在我意识到了两个事实:

  1. 不可能将插槽实现为纯虚拟成员函数,因为 moc 生成的代码需要调用它们。
  2. QObject 派生类不支持多重继承。那不是钻石的事。这是因为 moc 生成的代码不能 static_cast 一个虚拟的 QObject 对象通过虚拟基础到 A*。 (编译器就是这么说的!)

尽可能减少对代码的影响的最佳替代设计是什么?我可以想到宏黑客。也许基类中的宏(如Q_OBJECT)将基类的所有成员、信号、槽复制到派生类?

注意 不能多次继承QObjects 真是太糟糕了。不是吗?

【问题讨论】:

    标签: c++ qt inheritance diamond-problem moc


    【解决方案1】:

    如果你真的需要通过AB 类公开QObject 成员函数,请创建一个抽象基类(即只有纯虚成员函数的类),比如AbstractQObject,然后重新声明那里有您需要公开的QObject 成员函数。

    AB 虚拟派生自AbstractQObjectXQDialogAB

    这应该可以解决您描述的问题,但我怀疑您最好重新设计您的代码。

    【讨论】:

    • 不,这与QObject 成员无关。 AB使用信号和槽,所以需要继承QObject并在类中声明Q_OBJECT宏。例如A 有一个QFutureWatcher 对象运行一个线程并将其finished 信号连接到As 插槽之一。
    • 那么恐怕您唯一的选择是尝试重新组织您的代码,以便使用组合和委托而不是继承
    猜你喜欢
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2012-01-24
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多