通过QObject子类实现多重继承的最佳解决方案

时间:2014-03-27 16:33:05

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

我有多个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*。 (这就是编译器所说的!)
  3. 尽可能减少影响代码的最佳替代设计是什么?我可以想到宏观黑客。也许基类中的一个宏(如Q_OBJECT)将所有成员,信号,基数插槽复制到派生类中?

    注意 QObject无法多次继承,这真的很糟糕。 ISN'吨?

1 个答案:

答案 0 :(得分:2)

如果您确实需要通过QObjectA类公开B成员函数,请创建一个抽象基类(即只包含纯虚拟成员函数的类),例如{{ 1}},并重新声明需要公开的AbstractQObject成员函数。

QObjectA几乎来自BAbstractQObject来自XQDialogA

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