在下一个代码中,在_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
正在f()
从A1
和两者获取方法B
。要仅继承一次,所有符合条件的类都必须虚拟继承该方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句