钻石的问题(Diamond problem)

2019-09-29 05:51发布

我正想通过钻石的问题与思考各种方案会奏效。 这是一个当中,我正在研究。

#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变量? 任何投入。

Answer 1:

你做,你做了什么有:

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

但是,它可能不是你所要实现的目标是什么。 可能的话,你应该使用virtual继承? 你有什么手段都会有两份MainBase在对象的成员,每一个继承轨道。

(从MSDN)。

当一个基类被指定为一个虚拟的基础上,它可以作为一个间接基不止一次作用没有其数据成员的重复。 它的数据成员的单个副本是由使用它作为一个虚拟基的所有基类的共享。

也许这样的事情会更适合你:

class Derived1: virtual public MainBase{


Answer 2:

您的代码将不能编译,指Mainbase作为钻石实例的基础时出现混淆。 你需要让他们分享基类的一个实例,像这样使用在派生类(Derived1,Derived2的) 虚拟来解决这种不确定性:

class Derived1: virtual public Mainbase {
/* do your thing here*/
};


Answer 3:

您应该能够从访问这样的Diamond类:

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

假设你的代码在第一时间正确编译。 见迈克尔Foukarakis' 回答了更多的编译。 另外,看到这个DDJ优秀的文章: “多继承认为是有用的”关于如何正确地做到这一点。



文章来源: Diamond problem