多态性歧义,我们可以用“默认”基础来解决它们吗

问题描述 投票:0回答:2

我需要一个涉及

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

c++ polymorphism
2个回答
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 继承的方法会发生什么?

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


0
投票

好的答案:除非绝对必要,否则不要将任何东西建模为继承。

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

© www.soinside.com 2019 - 2024. All rights reserved.