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++ - concetto di ereditarietà e polimorfismo
Forum - C/C++ - concetto di ereditarietà e polimorfismo

Avatar
matteog (Normal User)
Pro


Messaggi: 149
Iscritto: 10/04/2009

Segnala al moderatore
Postato alle 16:19
Mercoledì, 18/11/2009
ciao a tutti il mio professore mi ha assegnato un lavoro per casa che consiste nello scrivere in c++ il seguente programma:

creare un classe generale con delle sottoclassi sull'argomento animali mediante l'utilizzo dei concetti di eredità e polimorfismo,ma ho un problema di comprensione infatti mi sono fermato dopo la scrittura della classe animale mi potete spiegare cosa fare e come farlo??


Codice sorgente - presumibilmente C#

  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <string>
  4. #using namespace std;
  5. class animale
  6. {
  7. public:
  8.         string specie;
  9.         string descrizione;
  10.         int zampe;
  11.         string abithat;
  12.         string cibo;
  13.        
  14.  
  15. };
  16. class terresttri:public animale
  17. {
  18. };
  19.  
  20. class acquatici:public animale
  21. {
  22.  
  23. };




questo è quello che vorrei fare nn voglio il programma vorrei solo una mano per farlo grazie
mille!!

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 18:53
Mercoledì, 18/11/2009
appunto iniziale: togli il # dalla clausola using, si scrive
Codice sorgente - presumibilmente C/C++

  1. using namespace std;



per l'ereditarietà e il polimorfismo, ti faccio un piccolo esempio(quello classico) per farti capire...
allora, mettiamo caso che hai una classe mammifero
Codice sorgente - presumibilmente C/C++

  1. class mammifero
  2. {
  3. public:
  4.     virtual void tipo()
  5.     {
  6.          std::cout << "mammifero" << std::endl;
  7.     }
  8. };


rapidamente: la classe espone un unico metodo che descrive il tipo di animale rappresentato dall'istanza attiva. Facendo quindi nel main
Codice sorgente - presumibilmente C/C++

  1. int main()
  2. {
  3.     mammifero m;
  4.     m.tipo();
  5.     return 0;
  6. }


OUTPUT: mammifero

Adesso, aggiungiamo altre due classi, cane e gatto

Codice sorgente - presumibilmente C++

  1. class cane: public mammifero
  2. {
  3. public:
  4.    void tipo()
  5.    {
  6.        std::cout << "sono un cane" << std::endl;
  7.    }
  8. };
  9.  
  10. class gatto: public mammifero
  11. {
  12. public:
  13.    void tipo()
  14.    {
  15.        std::cout << "sono un gatto" << std::endl;
  16.    }
  17. };



ecco, le due classi derivate fanno un overload del metodo della classe base. Questo permette di fare una cosa del genere:
Codice sorgente - presumibilmente C/C++

  1. int main()
  2. {
  3.     cane c;
  4.     gatto g;
  5.     c.tipo();
  6.     g.tipo();
  7.     return 0;
  8. }


e avere come OUTPUT:
sono un cane
sono un gatto

tuttavia questo è solo overload delle funzioni membro. La clausola "virtual" che vedi nella classe base però permette anche di fare una cosa così(chiamata appunto polimorfismo)
Codice sorgente - presumibilmente C/C++

  1. int main()
  2. {
  3.     mammifero *m;
  4.     cane c;
  5.     m = &c;
  6.     m->tipo();
  7.     return 0;
  8. }


OUTPUT: sono un cane

questo perché, nonostante io stia chiamando il metodo partendo dalla classe base, la key virtual mi salva in memoria un puntatore ad una tabella virtuale che mi tiene conto di che tipo è in realà quel puntatore.
Quindi verrà chiamato il metodo corretto.


Prova a ragionarci su e pensa a come fare il tuo esercizio;)

PM Quote
Avatar
matteog (Normal User)
Pro


Messaggi: 149
Iscritto: 10/04/2009

Segnala al moderatore
Postato alle 19:43
Mercoledì, 18/11/2009
grazie mille mi sei stato veramente di aiuto ce lò fatta senza problemi sei grande!!:k::k::k:


grazie ancora

PM Quote