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