多态性歧义,我们能否用"default"基础来解决它们
Polymorphism ambiguities, can we resolve them with a "default" base to use
我需要一层涉及可以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
继承了Nasty
和Class2
的QGLWidget
;每个人都有一个QGWidget
里面,总的来说我有 3 个(因为 Class2 已经继承了两次(。
现在假设对我来说,考虑到我的类的语义,应该Very_Nasty::Nasty::QGLWidget
一个用于消除歧义的基类。如果您说自动消除歧义是一种解决多重继承歧义的方法,我应该能够在多重继承的每个情况下指定它。
如果我通过Very_nasty
从 MyClass2 继承的方法调用会发生什么情况?
如果我通过Very_nasty
调用从 Nasty 继承的方法会发生什么?
他们将采取两种不同的消除歧义路径。冲突。
很好的答案:在绝对必要之前,不要将任何东西建模为继承。
确切答案:使用虚拟基类。
- 在提升multi_index容器中,是否定义了"default index"?
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- Ardunio UNO解决了多个重叠的定时器循环
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 两个文件使用彼此的功能-如何解决
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 在java中解决这段代码时面临循环中的问题
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 难以理解某些人解决IOI问题的源代码
- visual c++,如何获取解决方案目录中的代码
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 节俭并发:未解决的外部问题
- IpOpt拒绝解决不受约束的问题
- 如何解决这个超硬恒星的创造问题
- 如何解决gthr-default.h的问题?
- 我的模板二叉搜索树类给出了错误"Node<T>: no appropriate default constructor available,"如何解决这个问题?
- 如何解决类构造函数中的"redefinition of default parameter"
- 多态性歧义,我们能否用"default"基础来解决它们