2009-08-12 25 views
1

私はダイヤモンドの問題を克服していました。さまざまなシナリオで考えられました。そして、これは私が取り組んでいるものの一つです。ダイヤモンドの問題

#include <iostream> 
using namespace std; 
class MainBase{ 

    public: 
    int mainbase; 
    MainBase(int i):mainbase(i){} 
    void geta() 
    { 
     cout<<"mainbase"<<mainbase<<endl; 
    } 
}; 
class Derived1: public MainBase{ 

    public: 
    int derived1; 
    int mainbase; 
    Derived1(int i):MainBase(i),derived1(i) {mainbase = 1;} 
    public: 
    void getderived1() 
    { 
     cout<<"derived1"<<derived1<<endl; 
    } 

}; 
class Derived2: public MainBase{ 

    public: 
    int derived2; 
    int mainbase; 
    Derived2(int i):MainBase(i),derived2(i){mainbase = 2;} 
    public: 
    void getderived2() 
    { 
     cout<<"derived2"<<derived2<<endl; 
    } 
}; 
class Diamond: public Derived1, public Derived2{ 

    public: 
    int diamond; 
    int mainbase; 
    Diamond(int i,int j, int x):Derived1(j),Derived2(x),diamond(i){mainbase=3;} 
    public: 
    void getdiamond() 
    { 
     cout<<"diamond"<<diamond<<endl; 
    } 
}; 
int main() 
{ 
    Diamond d(4,5,6); 
// cout<< d.MainBase::mainbase; 
    cout<<"tested"<<endl; 
    cout<<d.mainbase; 
    cout<<d.Derived2::mainbase<<endl; 
    cout<<d.Derived1::mainbase<<endl; 
    /*cout<<d.Derived2::MainBase::mainbase<<endl; 
    cout<<d.Derived1::MainBase::mainbase<<endl;*/ 
} 

MainBaseクラスのmainbase変数にアクセスするにはどうすればいいですか?任意の入力。

+0

、コードをしてください修正してください。それをすべて選択して010101をヒットしてください。 – jkeys

+0

実際、見ることは悪夢です。 :( –

+1

ダイアモンドの問題: "複数の継承と知識構成を持つオブジェクト指向プログラミング言語では、ダイアモンド問題は2つのクラスBとCがAから継承し、クラスDがBとCの両方から継承するときに生じるあいまいさです。 DのメソッドはAで定義されたメソッドを呼び出し(メソッドをオーバーライドしません)、BとCはそのメソッドを別の方法でオーバーライドしてから、どのクラスからBまたはCを継承しますか? "source:http:// en .wikipedia.org/wiki/Diamond_problem – Adriaan

答えて

5

は、あなたがそこに何をしたかの操作を行います。

cout<<d.Derived2::MainBase::mainbase<<endl; 
cout<<d.Derived1::MainBase::mainbase<<endl; 

しかし、それはあなたが達成しようとしている何をしない場合があります。可能であれば、virtualの継承を使用する必要がありますか?あなたが持っているのは、オブジェクト内にMainBaseメンバーの2つのコピーが存在することを意味します。各継承トラックに1つずつあります。

(MSDNより)基底クラスが 仮想ベースとして指定されている場合

、それはそのデータメンバーの 重複することなく、複数回 間接的な拠点として機能することができます。 そのデータメンバーの単一コピーは、 が仮想ベースとして使用するすべての基本クラスで共有される です。

おそらくこのようなものは、より良いあなたに合うでしょう:ダイヤモンドインスタンスのベースとしてMainbaseを参照するときに

class Derived1: virtual public MainBase{ 
+0

@ 1800お知らせありがとう – Lakshmi

0

あなたはDiamondクラスからこのようにアクセスすることができるはずです。

Diamond::foo() { 
    Mainbase::mainbase = 0; 
} 

は、あなたのコードは、最初の場所で適切にコンパイルすると仮定すると。コンパイルの詳細については、Michael Foukarakis'answerを参照してください。また、これを正しく行う方法については、DDJ:"Multiple Inheritance Considered Useful"のこの優秀な記事を参照してください。

2

あなたのコードがコンパイルされません、あいまいさがあります。あなたはこのように、彼らは、基本クラスの単一のインスタンスを共有できるようにすることで、この曖昧さを解決するために、派生クラス(Derived1、Derived2)に仮想を使用する必要があります。

class Derived1: virtual public Mainbase { 
/* do your thing here*/ 
}; 
関連する問題