如何解决多态性模棱两可,我们是否可以使用“默认”基来解决它们
|| 我需要一层涉及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 ++语言级别是否可行。
通过显式地给出应执行其方法的类,可以逐个情况消除歧义,如下所示:
QGLWidget::ambiguous_method(...
我知道,这不是您要的,我相信您已经知道了。我说的只是为了完整性。
另一方面,我不确定这种自动消除歧义是理想的还是仅是有用的,因为关于多重继承“微妙”的要点是在派生类内部复制数据。如果您具有自动消除歧义的功能,则最终(有时没有歧义)最终会使用与基类相对应的部分对象,而在其他情况下,则会使用与另一基础类相对应的部分对象(由于自动消除歧义),得到一堆毫无意义的东西,即损坏的物体...
最后,我认为,如果您有更复杂的继承图(例如,按照您的示例),则这种自动消除歧义将是不可行的:
class Nasty : QGLWidget {};
class Very_nasty : Nasty,MyClass2 {};
自动消除歧义是不可能的。确实,假设您提供的类构成一个库,并且您在构建库时决定使用ѭ9作为歧义消除的基础。
现在,我将使用您的库,并再定义两个类似于我给定的类的类。 Very_nasty
从Nasty
和Class2
继承QGLWidget
;每个人里面都有一个14英镑,而我总共有3个(因为Class2已经继承了两次)。
现在假设对我来说,根据类的语义,用于歧义消除的基类应该是15。如果您说自动歧义消除是解决具有多重继承的歧义的一种方法,那么我应该能够在多重继承的每种情况下指定它。
如果通过ѭ10调用从MyClass2继承的方法会发生什么?
如果我通过ѭ10调用从Nasty继承的方法会怎样?
他们将采取两种不同的消除歧义的途径。冲突。
,好的答案:在绝对必要之前,不要将任何模型建模为继承。
确切答案:使用虚拟基类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。