2016-04-19 13 views
0

私はC++プログラムを書いています。ハイブリッド継承の派生クラスから基本クラスの変数へのアクセス

#include <iostream> 
#include <string> 

using namespace std; 

class A 
{ 
    int a; 
public: 
    void read() 
    { 

     cin>>a; 
    } 
}; 

class B:public A 
{ 
public: 
    B() 
    { } 
}; 

class C:public A 
{ 
public: 
    C() 
    {} 
}; 

class D:public B,public C 
{ 
public: 

    void display() 
    { 
     cout<<a<<endl; 
    } 
}; 

void main() 
{ 
    A a1;B b1;C c1; 
    D d1; 
    d1.display(); 
} 

曖昧さがあるというメッセージが表示されます。 BはAを継承しているので、BクラスはクラスAからアイテム 'a'を継承します。また、CクラスはクラスAからアイテム 'a'を継承します。今、クラスDのBクラスとCクラスの両方を継承しようとすると、 'a'にアクセスできますか?クラスBからまたはクラスCからあいまいさを取り除く方法はありますか?

+1

"どのアイテムにもアクセスできるようになります" - *どちらの*でも、あなたは今やっている方法ではありません。 1つを選択し、 'BaseClassName :: a 'で指定します。しかし、どういうわけか、私はそれがあなたが本当に望んでいるものであると疑う。私はバーチャルベースのダイヤモンドの継承は、あなたが求めるものだと思う。 (そしてそこに、Googleとヒットするいくつかのキーワード)。 – WhozCraig

+0

これは[恐怖の菱形](https://isocpp.org/wiki/faq/multiple-inheritance#mi-diamond)と呼ばれることがあります。 – callyalater

答えて

0

次のいずれかのオプションを使用して、あいまいさの問題を解決することができます

は、基本クラスの明示的な基底クラス

void display() 
    { 
    cout<< B::a <<endl; 
    } 

または使用など

使用Bについて明示して明示的な基本クラスとしてC

void display() 
    { 
    cout<< C::a <<endl; 
    } 

使用virtual継承virtual継承を使用する

変更BC

class B: virtual public A 
{ 
    public: 
     B() {} 
}; 

class C: virtual public A 
{ 
    public: 
     C() {} 
}; 
関連する問題