我需要一个涉及
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 {};
不可能自动消除歧义。事实上,假设您提供的类形成了一个库,并且您决定在构建该库时使用
MyClass2::QGLWidget
作为消除歧义的基础。
现在,我使用您的库并定义另外两个类,就像我给出的类一样。
Very_nasty
从 QGLWidget
和 Nasty
继承 Class2
;每个里面都有一个QGWidget
,总共我有3个(因为Class2已经继承了它两次)。
现在假设对我来说,考虑到我的类的语义,消歧的基类应该是
Very_Nasty::Nasty::QGLWidget
。如果您说自动消歧是解决多重继承歧义的一种方法,那么我应该能够在每种多重继承情况下指定它。
如果我通过
Very_nasty
调用从MyClass2继承的方法会发生什么?
如果我通过
Very_nasty
调用从 Nasty 继承的方法会发生什么?
他们会采取两种不同的消歧路径。冲突。
好的答案:除非绝对必要,否则不要将任何东西建模为继承。
确切答案:使用虚拟基类。