多态性模糊,我们可以用“默认”基础来解决它们

时间:2011-05-26 16:10:13

标签: c++ compiler-construction polymorphism

我需要一个涉及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就是一个例子。

2 个答案:

答案 0 :(得分:0)

我个人怀疑这种自动消歧在C ++语言层面是可行的。

可能的是,通过明确地给出应该执行其方法的类来逐个消除歧义,如下所示:

QGLWidget::ambiguous_method(...

这不是你要求的,我知道,我相信你已经知道了。我只是说完整。

另一方面,我不确定这种自动消除歧义是可取的还是仅仅是有用的,因为关于多继承是“微妙的”的要点是在派生类内部复制数据。如果你有自动消歧,你最终会使用(当没有歧义时)对应于基类的部分对象,而在其他情况下使用对应于另一个基类的部分对象(因为自动消除歧义),你会得到一些没有任何意义的东西,即一个腐败的对象......

最后,我认为如果您有更复杂的继承图,这种自动消歧是不可行的,例如,按照您的示例:

class Nasty : QGLWidget {};

class Very_nasty : Nasty, MyClass2 {};

不可能自动消除歧义。实际上,假设您提供的课程形成了一个库,并且您在构建库时决定使用MyClass2::QGLWidget作为消除歧义的基础。

现在,我带你的库并定义两个类,就像我给的那些。 Very_nastyQGLWidgetNasty继承Class2;每个人都有QGWidget内部,总体而言我有3个(因为Class2已经继承了两次)。

现在假设对我来说,根据我的类的语义,消歧的基类应该是Very_Nasty::Nasty::QGLWidget。如果你说自动消歧是一种解决多重继承歧义的方法,我应该能够用每个多重继承的情况来指定它。

如果我通过Very_nasty调用从MyClass2继承的方法会怎样?

如果我通过Very_nasty调用从Nasty继承的方法会怎样?

他们将采取两种不同的消歧途径。冲突。

答案 1 :(得分:0)

答案很好:在绝对必要之前,不要将任何东西建模为继承。

确切答案:使用虚拟基类。