Вопрос

Я рассматривал проблему с алмазами и подумал, что буду работать над различными сценариями.И это один из них, над которым я работал.

#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?Любые входные данные.

Это было полезно?

Решение

Вы делаете то, что вы сделали там:

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

Но это может привести не к тому, чего вы пытаетесь достичь.Возможно, вам следует использовать virtual наследство?То, что у вас есть, означает, что будет две копии MainBase элементы в вашем объекте, по одному для каждой дорожки наследования.

(Из MSDN).

Когда базовый класс указан как виртуальная база, он может действовать как косвенная база более одного раза без дублирования своих элементов данных.A единственная копия его элементов данных является общей для всех базовых классов, которые используют его в качестве виртуальной базы.

Вероятно, что-то подобное вам подойдет больше:

class Derived1: virtual public MainBase{

Другие советы

Ваш код не скомпилируется, существует двусмысленность при упоминании Mainbase как основы экземпляра Diamond.Вам нужно использовать виртуальный в производных классах (Derived1, Derived2), чтобы разрешить эту двусмысленность, разрешив им совместно использовать один экземпляр базового класса, например:

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

Вы должны иметь возможность получить к нему доступ вот так из Diamond сорт:

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

Предполагая, что ваш код вообще компилируется правильно.Видеть Майкл Фукаракис отвечать подробнее о компиляции.Также см. эту замечательную статью от DDJ: «Множественное наследование считается полезным» о том, как это сделать правильно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top