1

私は菱形継承問題を経験していて、さまざまなシナリオでうまくいくと思いました。そして、これは私が取り組んでいたものの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変数にアクセスする方法を知りたいですか?任意の入力。

4

3 に答える 3

5

あなたはそこであなたがしたことをします:

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

しかし、それはあなたが達成しようとしていることをしないかもしれません。virtualおそらく、継承を使用する必要がありますか?MainBaseつまり、オブジェクトには、継承トラックごとに1つずつ、2つのメンバーのコピーがあります。

(MSDNから)。

基本クラスが仮想ベースとして指定されている場合、データメンバーを複製することなく、間接ベースとして複数回機能できます。そのデータメンバーの単一のコピーは、それを仮想ベースとして使用するすべての基本クラスによって共有されます。

おそらく、このようなものの方が適しています。

class Derived1: virtual public MainBase{
于 2009-08-12T05:33:35.373 に答える
2

コードはコンパイルされません。MainbaseをDiamondインスタンスのベースとして参照する場合、あいまいさがあります。次のように、派生クラス(Derived1、Derived2)で仮想を使用して、基本クラスの単一インスタンスを共有できるようにすることで、このあいまいさを解決する必要があります。

class Derived1: virtual public Mainbase {
/* do your thing here*/
};
于 2009-08-12T05:34:54.137 に答える
0

Diamondクラスから次のようにアクセスできるはずです。

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

そもそもコードが正しくコンパイルされると仮定します。コンパイルの詳細については、 MichaelFoukarakisの 回答を参照してください。また、これを正しく行う方法については、DDJのこの優れた記事「多重継承は有用と見なされます」を参照してください。

于 2009-08-12T05:33:27.447 に答える