我收到了错误ambiguous access mg
。但mg仅受公共访问保护和继承。为什么会这样?请点亮一些。谢谢你的时间!
class A{
protected:
int mg;
static int ms;
};
class B : public A{
protected:
using A::ms;
};
class C : public A, public B{
public:
void fn(){
cout << mg;
cout << ms;
}
};
int A::ms = 0;
int main(){
C c;
c .fn();
}
答案 0 :(得分:2)
在此示例中,您在类A
中有两个基类C
的副本,因为B
已从A
派生。这也在A
中提供了C
的基类:
class C : public B{
public:
void fn(){
cout << mg;
cout << ms;
}
};
这个问题被称为“死亡钻石”,用于解释多重继承的危险。除此之外,它已被缩减为“死亡三角”。
答案 1 :(得分:2)
C
中的,A::mg
可以引用从A
继承的,或从B
继承的那个,因为B
继承了A
}。所以这个电话是模棱两可的:你真的指的是哪一个?
使用虚拟继承可以解决此问题。您可以看到问题this answer与您的问题非常相似:钻石继承。