Pregunta

Yo estaba pasando por el problema de diamantes y el pensamiento va a trabajar en diversos escenarios. Y este es uno de ellos, que yo estaba trabajando.

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

Ahora estoy preguntando cómo puedo acceder a la variable de clase MainBase mainbase? Cualquier entrada.

¿Fue útil?

Solución

Uno hace lo que ha hecho allí:

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

Sin embargo, no podría hacer lo que está tratando de lograr. Posiblemente, usted debe utilizar la herencia virtual? Lo que tienes significa que habrá dos copias de los miembros MainBase en su objeto, una para cada vía de herencia.

(From MSDN).

  

Cuando se especifica una clase de base como una   base virtual, que puede actuar como una   de base indirecta más de una vez sin   la duplicación de sus miembros de datos. UNA   copia simple de sus miembros de datos es   compartida por todas las clases base que   utilizarlo como una base virtual.

Probablemente algo como esto te irá mejor:

class Derived1: virtual public MainBase{

Otros consejos

Su código no se compilará, hay una ambigüedad cuando se hace referencia a Mainbase como base de una instancia de diamante. Es necesario utilizar Virtual en las clases derivadas (Derived1, Derived2) para resolver esta ambigüedad por lo que les permite compartir una única instancia de la clase base, como esto:

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

Usted debe ser capaz de acceder a él como esta de la clase Diamond:

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

Si se asume que el código se compila correctamente en el primer lugar. Ver Michael Foukarakis' contestar para más información sobre la compilación. Además, vea este excelente artículo de DDJ: "herencia múltiple consideran útiles" sobre cómo hacer esto correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top