钻石问题

Lak*_*hmi 1 c++ multiple-inheritance diamond-problem

我正在经历钻石问题,思想会在各种情况下发挥作用.这是我正在研究的其中一个.

#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;*/
}
Run Code Online (Sandbox Code Playgroud)

我现在想知道如何访问MainBase类的mainbase变量?任何输入.

180*_*ION 5

你做你在那里做的事情:

cout<<d.Derived2::MainBase::mainbase<<endl;
cout<<d.Derived1::MainBase::mainbase<<endl;
Run Code Online (Sandbox Code Playgroud)

但是,它可能无法实现您想要实现的目标.可能,你应该使用virtual继承?你拥有的东西意味着MainBase你的对象中会有两个成员副本,每个成员对应一个继承轨道.

(来自MSDN).

当基类被指定为虚拟基础时,它可以不止一次地充当间接基础而不重复其数据成员.其数据成员的单个副本由将其用作虚拟基础的所有基类共享.

可能这样的事情会更适合你:

class Derived1: virtual public MainBase{
Run Code Online (Sandbox Code Playgroud)