为什么单独一个孩子班级错误?订单有关系吗?

时间:2013-12-25 17:53:34

标签: c++ inheritance

我正在阅读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。

1 个答案:

答案 0 :(得分:4)

DB公开继承,但C私下。如果您想从两者公开继承,请使用此选项:

class D: public B, public C { public: void eat(){ cout<<"D";} };