虚继承歧义函数
Virtual inheritance ambiguous function
我有这部分代码
#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
继承。代码编译通过,class C
和之前一样没有报错。
如果我从最后一行代码中删除注释,它仍然可以编译。我知道在这种情况下,将要执行的 f()
函数是 C
继承自的第一个 class 函数。
现在,如果我将 c.A::f()
替换为 c.f()
,我会在该特定行收到编译错误。
有人可以解释这种行为以及这些情况之间的区别吗?
在 class C 中,您必须选择要使用的 f 变体。即 using B1::f;
或 using B2::f
.
问题出在 C
而不是你的表达式调用。由于 f
是虚拟的并且在 B1
和 B2
中重新定义了两次,因此 C
class 格式错误,因为对 f
的调用会产生歧义(选择哪个覆盖?)。在 C
中添加 f
的覆盖,一切都会正常。
我有这部分代码
#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
继承。代码编译通过,class C
和之前一样没有报错。
如果我从最后一行代码中删除注释,它仍然可以编译。我知道在这种情况下,将要执行的 f()
函数是 C
继承自的第一个 class 函数。
现在,如果我将 c.A::f()
替换为 c.f()
,我会在该特定行收到编译错误。
有人可以解释这种行为以及这些情况之间的区别吗?
在 class C 中,您必须选择要使用的 f 变体。即 using B1::f;
或 using B2::f
.
问题出在 C
而不是你的表达式调用。由于 f
是虚拟的并且在 B1
和 B2
中重新定义了两次,因此 C
class 格式错误,因为对 f
的调用会产生歧义(选择哪个覆盖?)。在 C
中添加 f
的覆盖,一切都会正常。