C++ 虚继承模糊函数

C++ 虚继承模糊函数,c++,multiple-inheritance,C++,Multiple Inheritance,我有这部分代码 #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 : v

我有这部分代码

#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();
}
如果我删除
虚拟
继承。代码编译后,类
C
与以前一样没有错误

如果我从最后一行代码中删除注释,它仍会编译。我知道在这种情况下,将执行的
f()
函数是
C
继承自的第一个类的函数

现在,如果我用
c.f()
替换
c.A::f()
,我会在这一行得到一个编译错误


有人能解释一下这种行为以及这些情况之间的区别吗?

在C类中,你必须选择f到usr的哪个变体。也就是说,
使用B1::f
使用B2::f

在C类中,您必须选择f的哪一个变体用于usr。也就是说,
使用B1::f
使用B2::f

问题在于
C
而不是表达式调用。由于
f
是虚拟的,并且在
B1
B2
中重新定义了两次,因此
C
类的格式不正确,因为对
f
的调用不明确(选择哪个覆盖?)。在
C
中添加对
f
的覆盖,一切都会正常。

问题在于
C
而不是表达式调用。由于
f
是虚拟的,并且在
B1
B2
中重新定义了两次,因此
C
类的格式不正确,因为对
f
的调用不明确(选择哪个覆盖?)。在
C
中添加一个对
f
的覆盖,一切都会好起来。

我知道如何使它工作,但我试图理解这种行为的概念和原因。原因是它在两个基类中看到两个相互冲突的定义,而它不知道是哪一个。我的解决方案说明了您希望它使用哪一个。我知道如何使它工作,但我试图理解这种行为的概念和原因。原因是它在两个基类中看到两个相互冲突的定义,但它不知道是哪一个。我的解决方案说你想用哪一个。谁说的离题???这只是重复。谁说的离题???这只是复制品。
override of virtual function "A::f" is ambiguous