Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ereditarietà e casting
Forum - C/C++ - Ereditarietà e casting

Avatar
McFly (Normal User)
Newbie


Messaggi: 6
Iscritto: 06/01/2012

Segnala al moderatore
Postato alle 18:11
Domenica, 05/02/2012
Salve ragazzi,
ho un problemino con l'ereditarietà, ed in particolare il cast.
Faccio, come al solito.., un esempio per spiegarmi.

Codice sorgente - presumibilmente C/C++

  1. class A
  2. {
  3.     protected:
  4.          A *GetQualcosa();
  5. };
  6.  
  7. class B : public A
  8. {
  9.     ....... qualcosa!
  10. };



Supponiamo di aver ereditato il metodo GetQualcosa nella classe B.
Mi chiedevo, come faccio a far funzione un'assegnazione di questo tipo:

Codice sorgente - presumibilmente Plain Text

  1. B *obj1,*obj2;
  2.    obj2 = obj1->GetQualcosa();  // il compilatore mi da problemi!



Ho letto su alcune guide che il cast da una classe base ad una classe derivata non  è implicito (downcasting), allora come posso specificarlo? Qual'è il modo migliore?

Grazie!

Ultima modifica effettuata da McFly il 05/02/2012 alle 19:11
PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 22:06
Domenica, 05/02/2012
In primis tutti i metodi appartenenti allo specificatore di accesso protected, non sono accessibili dall'esterno. Quindi per ovvie ragioni sostituiamo quel protected in public. 
Bene, arriviamo al succo della questione. In C++ si possono effettuare assegnamenti solo da classe padre a classe figlio. Mi spiego meglio con un esempio:
Codice sorgente - presumibilmente C/C++

  1. Padre *myPadre = new Figlio; // questo e' possibile.  Da base a derivata
  2. Figlio *myFiglio = new Padre; // errore



Penso che sia chiaro adesso il problema :)

Qui c'è la soluzione nel caso non ti è chiaro qualche cosa http://pastebin.com/VAZEWB8j

Ultima modifica effettuata da Pitagora il 05/02/2012 alle 22:15
Ho capito quello che hai detto, ma il mio problema è leggermente diverso. A e B sono nodi di un albero nel mio caso, e B è una specifica rispetto ad A, quindi il metodo GetQualcosa mi restituisce un nodo di tipo A, ed io ho bisogno di utilizzarlo anche da B. - McFly - 06/02/12 09:53
In pratica io ho bisogno di fare un assegnazione del tipo B *nodo1,*nodo2; nodo1 = nodo2->GetQualcosa(); ma quel GetQualcosa mi restituisce A chiaramente, ed ho bisogno del downcasting perchè altrimenti non sfrutterei il concetto di ereditarietà! - McFly - 06/02/12 09:55
Figlio = Padre non puoi farlo come già detto. Trova un'altra strada - Pitagora - 06/02/12 18:24
PM