虚继承歧义函数

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 是虚拟的并且在 B1B2 中重新定义了两次,因此 C class 格式错误,因为对 f 的调用会产生歧义(选择哪个覆盖?)。在 C 中添加 f 的覆盖,一切都会正常。