我有这部分代码
#include <iostream>
using namespace std;
class A {
public:
int i;
A(){i = 0; }
virtual void f() { cout << i; }
};
class B1 : virtual public A {
public:
B1() { f(); }
void f() { cout << i+10; }
};
class B2 : virtual public A {
public:
B2() { f(); }
void f() { cout << i+1; }
};
class C : public B1, public B2 {
public:
C() {}
};
void main(){
C c;
//c.A::f();
}
首先,我理解使用虚拟继承(菱形)背后的主要思想,以便在内存中只创建一个A
对象。
在此示例中,我在C
class:
override of virtual function "A::f" is ambiguous
如果我删除了virtual
继承。代码编译,类C
中没有错误像以前一样。
如果我从最后一个代码行中删除注释,它仍会编译。我理解在这种情况下,将要执行的f()
函数是C
继承自的第一个类中的函数。
现在,如果我用c.A::f()
替换c.f()
,我会在此特定行收到编译错误。
有人可以解释一下这种行为以及这些案件之间的区别吗?
答案 0 :(得分:3)
问题在于C
没有表达式调用。由于f
是虚拟的,并且在B1
和B2
中重新定义了两次,因此C
类格式错误,因为对f
的调用不明确(可以选择覆盖) ?)。在f
中添加C
的覆盖,一切都会好的。
答案 1 :(得分:-1)
在C类中,您必须选择f的哪个变体到usr。即using B1::f;
或using B2::f
。