Pergunta

Eu estava atravessando o problema diamante e pensamento vai trabalhar em vários cenários. E este é um entre eles que eu estava trabalhando.

#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;*/
}

Agora estou querendo saber como eu acesso MainBase variável de classe mainbase? Quaisquer entradas.

Foi útil?

Solução

Você faz o que você fez lá:

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

Mas, ele não pode fazer o que você está tentando alcançar. Possivelmente, você deve estar usando herança virtual? O que você tem significa que haverá duas cópias dos membros MainBase em seu objeto, uma para cada faixa herança.

(De MSDN).

Quando uma classe base é especificado como um base virtual, que pode actuar como um mais de base indireta de uma vez sem duplicação de seus membros de dados. UMA cópia única de seus membros de dados é compartilhado por todas as classes base que usá-lo como uma base virtual.

Provavelmente algo como isso vai servi-lo melhor:

class Derived1: virtual public MainBase{

Outras dicas

Seu código não irá compilar, há uma ambigüidade quando se refere a Mainbase como base de uma instância de Diamond. Você precisa usar virtual nas classes derivadas (Derived1, Derived2) para resolver esta ambiguidade, permitindo-lhes compartilhar uma única instância de classe base, como este:

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

Você deve ser capaz de acessá-lo como esta da classe Diamond:

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

Assumindo que o seu código compila corretamente em primeiro lugar. Consulte Michael Foukarakis' resposta para mais informações sobre a compilação. Além disso, veja este excelente artigo de DDJ: "Herança múltipla considerado útil" sobre como fazer isso corretamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top