0

在下一个代码中,在 _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;
}
4

1 回答 1

4

您需要更改继承定义struct A1

struct A1: virtual A {

究其原因,钻石继承不明确struct D正在f()A1和获取方法B。要只继承一次,所有符合条件的类都必须虚拟地继承该方法。

于 2013-10-04T07:14:00.930 回答