【问题标题】:Virtual methods on a virtual base class虚拟基类上的虚拟方法
【发布时间】:2011-09-30 16:58:12
【问题描述】:

关于虚拟基类继承的一些事情让我感到困惑......鉴于以下类:

class A
{
  virtual void foo() = 0;
}
class B : virtual A
{
  void foo() { /* do X */ }
}
class C : virtual A
{
  void foo() { /* do Y */ }
}
class D : B, C
{
}

这会编译吗?如果是这样,以下代码的结果是什么:

D d;
A* a = &d;
a->foo();

【问题讨论】:

标签: c++ methods virtual multiple-inheritance


【解决方案1】:

它无法编译的三个原因都与虚拟继承无关(嗯,也许是最后一个)。

  1. 您忘记了类定义后的分号

  2. 您的继承是私有的

  3. D::foo() 在未显式覆盖时不明确

顺便说一句,D 本身的定义是错误的,而不仅仅是您尝试使用它的事实。我的意思是,如果您的 main() 函数为空,它仍然无法编译。

“这会编译吗?”有明显的答案“你为什么不试试?”

引用标准:10.3.10

以下示例显示了一个没有唯一性的函数 最终覆盖:

 struct A {
 virtual void f();
 };
 struct VB1 : virtual A { // note virtual derivation
 void f();
 };
 struct VB2 : virtual A {
 void f();
 };
 struct Error : VB1, VB2 { // ill-formed
 };

【讨论】:

  • 我意识到我只写了伪代码,关键是我暂时无法使用编译器,并且感觉大多数人都可以理解缺少一些分号的代码。
【解决方案2】:

它不会编译。海合会:

error: no unique final overrider for ‘virtual void A::foo()’ in ‘D’

你自己也可以很快发现的。

与 icc 相同:

error #361: override of virtual function "A::foo" is ambiguous

【讨论】:

    【解决方案3】:

    不,它不会:

    diamond.cpp:24:7: error: request for member ‘foo’ is ambiguous
    diamond.cpp:13:8: error: candidates are: virtual void C::foo()
    diamond.cpp:8:8: error:                 virtual void B::foo()
    

    这称为钻石问题,见http://en.wikipedia.org/wiki/Diamond_problem

    【讨论】:

      【解决方案4】:

      它不应该编译,函数 foo 会模棱两可。由于 A::foo() 是纯虚函数,因此必须解决歧义。

      【讨论】:

      • 即使 A::foo 不是纯虚拟的,它仍然会模棱两可,无法编译
      • 是的。但是代码也有许多其他问题。它们都是私有继承的, foo() 也是私有函数。
      猜你喜欢
      • 2013-10-23
      • 2015-06-13
      • 2020-10-21
      • 2013-05-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多