C++ 继承错误:不明确的错误

C++ Inheritance Error : ambiguous error

本文关键字:错误 不明确 C++ 继承      更新时间:2023-10-16

在下一个代码中,在 _tmain(..) 中调用 D::f 时出现歧义错误由于 B::f 覆盖了 A::f,因此 A::vtable 中指向 f 的指针指向 B::f。

1)为什么编译器会给出模棱两可的错误?有人可以澄清一下吗?

2)我试图通过将B::f(

int)更改为B::f(char)来重载A::f(int),但错误并没有消失!为什么?

继承图:

............A......
........../.|.....
........A1..B..C...
...........|./....
............D......

代码:

struct A { 
 virtual void f(int x) {cout << "A::f";}; 
 virtual void g(int x) {cout << "A::g";}; 
 private: int n; 
}; 
struct A1: A { 
 virtual void h(int x) {f(x);}; 
}; 
struct B : virtual A { 
 void f(int x) {cout << "B::f";}; 
}; 
struct C : virtual A { 
 void g(int x) {cout << "C::g";}; 
}; 
struct D : A1, B , C { 
};
int _tmain(int argc, _TCHAR* argv[])
{
    D* d = new D();
    d->f(1);
    return 0;
}

您需要更改struct A1的继承定义:

struct A1: virtual A {

究其原因,钻石传承含糊不清。 struct D正在从A1B中获取方法f()。若要仅继承一次,所有符合条件的类都必须虚拟继承该方法。