PDA

View Full Version : ereditarietà multipla in C++


opiu
22-10-2002, 15:37
Una classe D eredita da due classi B e C le quali ereditano a loro volta da una classe A. (ci siamo?!?scusate)

Nel main ho un oggetto di classe D sul quale voglio chiamare un metodo di A (non ridefinito da nessuna delle classi figlie di A)

Il compilatore dava errore

Ho allora ridefinito in D il metodo in modo tale che richiamasse lo stesso metodo da B

B::met();

Il compilatore dà ancora errore (non funziona nemmeno se richiamo il metodo direttamente dalla classe A)


Grazie mille
10q

ilsensine
22-10-2002, 16:18
Credo che ci siano tecniche più eleganti, ma specificare da quale "ramo" viene la funzione chiamata funziona:

class A {
public:
void foo() { cerr << "ciao" << endl; }
};

class B: public A {
};

class C: public A {
};


class D: public B, public C {
};

int main() {
D d;
d.B::foo();
return 0;
}

/\/\@®¢Ø
22-10-2002, 21:02
Originariamente inviato da opiu
[B]
Nel main ho un oggetto di classe D sul quale voglio chiamare un metodo di A (non ridefinito da nessuna delle classi figlie di A)

Il compilatore dava errore


Nella classe D, la classe base A compare due volte: una volta come 'padre' di B, l'altra come padre di C.
Devi quindi specificare quale dei due usare. Un modo e' fare come ha spiegato ilsensine.
Attento pero' che anche i dati della classe A sono raddoppiati, le due classi sono effettivamente distinte !
PEr avere una classe base unica devi cambiare leggermente le definizioni delle classi:

class A {
public:
void foo() { cerr << "ciao" << endl; }
};

class B: [b]virtual[/b] public A {
};

class C: [b]virtual[/b] public A {
};


class D: public B, public C {
};

int main() {
D d;
d.[b]A[/b]::foo();
return 0;
}

Con l'aggiunta di virtual prima di public (in tutte le classi interessate) ottieni un'unica classe base e ora puoi usare la forma A::foo()

cionci
23-10-2002, 09:49
Beh...a quel punto puoi anche chiamare direttamente d.foo();

/\/\@®¢Ø
23-10-2002, 11:18
ops.. hai ragione, dimenticavo che il metodo non e' stato ridefinito.

opiu
23-10-2002, 12:59
Grazie mille sono riuscito a risolvere il tutto!!!
ciao e alla prossima eh eh