我需要一个涉及QWidget
的抽象层,可以是QGLWidget
,我想知道是否有办法对编译器说,“任何时候你有疑问(含糊不清)尝试使用我给你的默认基础“,当然如果存在歧义,它无法用默认选择解决,它会像它一样提示错误。我的目标不是逐个明确地解决每一个歧义,因为我总是将它们重新指向同一个类。
快速设置,
#Qt inheritance (very roughly...)
class QWidget {};
class QGLWidget : public QWidget {};
#my side
class MyAbstract : public QWidget {}; //used by a factory
class MyClass1 : public MyAbstract {};
class MyClass2 : public MyAbstract, public QGLWidget{};
我知道编译器无法通过其自身的重复方法来确定MyClass2
类,因为QGLwidget
继承并重新实现了大多数QWidget
,但是我可以告诉编译器首先使用QGLWidget
因为我知道这就是我想要的吗?
Qt就是一个例子。
答案 0 :(得分:0)
我个人怀疑这种自动消歧在C ++语言层面是可行的。
可能的是,通过明确地给出应该执行其方法的类来逐个消除歧义,如下所示:
QGLWidget::ambiguous_method(...
这不是你要求的,我知道,我相信你已经知道了。我只是说完整。
另一方面,我不确定这种自动消除歧义是可取的还是仅仅是有用的,因为关于多继承是“微妙的”的要点是在派生类内部复制数据。如果你有自动消歧,你最终会使用(当没有歧义时)对应于基类的部分对象,而在其他情况下使用对应于另一个基类的部分对象(因为自动消除歧义),你会得到一些没有任何意义的东西,即一个腐败的对象......
最后,我认为如果您有更复杂的继承图,这种自动消歧是不可行的,例如,按照您的示例:
class Nasty : QGLWidget {};
class Very_nasty : Nasty, MyClass2 {};
不可能自动消除歧义。实际上,假设您提供的课程形成了一个库,并且您在构建库时决定使用MyClass2::QGLWidget
作为消除歧义的基础。
现在,我带你的库并定义两个类,就像我给的那些。 Very_nasty
从QGLWidget
和Nasty
继承Class2
;每个人都有QGWidget
内部,总体而言我有3个(因为Class2已经继承了两次)。
现在假设对我来说,根据我的类的语义,消歧的基类应该是Very_Nasty::Nasty::QGLWidget
。如果你说自动消歧是一种解决多重继承歧义的方法,我应该能够用每个多重继承的情况来指定它。
如果我通过Very_nasty
调用从MyClass2继承的方法会怎样?
如果我通过Very_nasty
调用从Nasty继承的方法会怎样?
他们将采取两种不同的消歧途径。冲突。
答案 1 :(得分:0)
答案很好:在绝对必要之前,不要将任何东西建模为继承。
确切答案:使用虚拟基类。