多态性歧义,我们能否用"default"基础来解决它们

Polymorphism ambiguities, can we resolve them with a "default" base to use

本文关键字:解决 default 多态性 我们 歧义      更新时间:2023-10-16

我需要一层涉及可以QGLWidget QWidget的抽象层,我想知道是否有办法对编译器说,"任何时候你有疑问(歧义(尝试使用我给你的默认基础",当然,如果有歧义它不能用默认选择解决,它会像它一样提示错误。我的目标不必一一明确地解决每个歧义,因为我总是会将它们重定向到同一个类。

快速设置,

#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只是一个例子。

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

可能的方法是,根据具体情况,通过显式给出应执行其方法的类来消除歧义,如下所示:

QGLWidget::ambiguous_method(...

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

另一方面,我不确定这种自动消除歧义是否可取或只是有帮助,因为关于多重继承"微妙"的要点是在派生类内部复制数据。如果你有自动消除歧义,你最终会有时(当没有歧义时(使用对应于基类的部分对象,而在其他情况下使用对应于另一个基类的分部对象(因为自动消除歧义(,你会得到一个没有任何意义的东西的马赛克,即一个损坏的对象......

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

class Nasty : QGLWidget {};
class Very_nasty : Nasty, MyClass2 {};

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

现在,我使用您的库并定义另外两个类,就像我给出的类一样。 Very_nasty继承了NastyClass2QGLWidget;每个人都有一个QGWidget里面,总的来说我有 3 个(因为 Class2 已经继承了两次(。

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

如果我通过Very_nasty从 MyClass2 继承的方法调用会发生什么情况?

如果我通过Very_nasty调用从 Nasty 继承的方法会发生什么?

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

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

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