让我对虚拟基类继承感到困惑的事情......给出以下类:
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();
答案 0 :(得分:7)
它不应该编译,函数foo将是不明确的。由于A :: foo()是纯虚函数,因此必须解决歧义。
答案 1 :(得分:4)
由于三个原因,它无法编译,这些原因都与虚拟继承无关(好吧,也许是最后一个)。
您忘记了课程定义后的分号
您的继承是私有的
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 :(得分: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