我正在阅读java中的钻石继承问题。所以想知道其他语言是如何解决的,并发现c ++已经解决了它。 我发现了How does virtual inheritance solve the "diamond" (multiple inheritance) ambiguity?。然后我在online c++ compiler中尝试了这段代码 。 我试过了
#include <iostream>
using namespace std;
class A { public: void eat(){ cout<<"A";} };
class B: virtual public A { public: void eat(){ cout<<"B";} };
class C: virtual public A { public: void eat(){ cout<<"C";} };
class D: public B,C { public: void eat(){ cout<<"D";} };
int main()
{
A *a = new D();
a->eat();
}
有效。然后我想调用B吃掉并改变A * a = new D();到
B *a = new D();
这太有用了。但是当我尝试
时C *a = new D();
它扔了错误
错误:'C'是'D'无法访问的基础 C * a = new D();
为什么单独使用C这个错误?它甚至是公开的。那为什么它无法访问?
所以我所做的是将继承顺序改为
class D: public C,B { public: void eat(){ cout<<"D";} };
现在C * a =新D();但是B * a = new D();失败了。
为什么会这样?
订单重要吗?
当我用Google搜索时,我发现了这个stackoverflow link,但发现它是为了构造函数。 我无法理解为什么这个案子会失败。
如果我的问题很愚蠢,请原谅,因为我对C ++很陌生。我习惯于只有没有多重继承的java。
答案 0 :(得分:4)
D
从B
公开继承,但C
的私下。如果您想从两者公开继承,请使用此选项:
class D: public B, public C { public: void eat(){ cout<<"D";} };