虚拟基类上的虚方法

时间:2011-07-07 18:12:47

标签: c++ methods virtual multiple-inheritance

让我对虚拟基类继承感到困惑的事情......给出以下类:

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();

4 个答案:

答案 0 :(得分:7)

它不应该编译,函数foo将是不明确的。由于A :: foo()是纯虚函数,因此必须解决歧义。

答案 1 :(得分:4)

由于三个原因,它无法编译,这些原因都与虚拟继承无关(好吧,也许是最后一个)。

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

  2. 您的继承是私有的

  3. D::foo()在未明确覆盖

  4. 时不明确

    顺便说一下,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 :(得分:4)

它不会编译。 GCC:

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

你可以很快发现自己。

与icc相同:

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

答案 3 :(得分: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