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++ - Polimorfismo e sua applicazione
Forum - C/C++ - Polimorfismo e sua applicazione

Avatar
McFly (Normal User)
Newbie


Messaggi: 6
Iscritto: 06/01/2012

Segnala al moderatore
Postato alle 18:18
Venerdì, 06/01/2012
Salve ragazzi, ho un piccolo problemino nell'applicazione del concetto di polimorfismo.

Faccio un breve esempio generico per farvi capire qual'è il problema, senza soffermarmi sui dettagli e le implementazioni dei metodi delle rispettive classi.

Codice sorgente - presumibilmente C++

  1. class A
  2. {
  3.     public:
  4.        void metodo1();
  5.        void metodo2();
  6. };
  7.  
  8.  
  9. void A::metodo1()
  10. {
  11.    // fa qualcosa
  12. }
  13.  
  14. void A::metodo2();
  15. {
  16.     // fa qualcosa
  17.     metodo1();  // usa il metodo 1
  18.     // fa qualcos'altro ancora
  19. }



Fin qui nessun problema.... ora creo una classe B che eredita da A


Codice sorgente - presumibilmente C/C++

  1. class B : public A
  2. {
  3.    // definizione classe B
  4. };



Qui arrivano i problemi, in quanto in questa classe mi servirebbe il metodo2() della classe A(che applicando l'ereditarietà ho a disposizione tranquillamente)
che ha al suo interno il metodo1() che oltre che fare (quel qualcosa che fa nella classe A, ho bisogno di aggiungere altre istruzioni).

quindi

Codice sorgente - presumibilmente C/C++

  1. void metodo1()
  2. {  // fa quello che fa nella classe A
  3.    // aggiunta istruzioni da fare solo nella classe B
  4. }




Ora mi chiedo innanzitutto se per realizzare ciò, è corretto utilizzare il polimorfismo, ed in caso affermativo, è sufficiente dichiarare metodo1 nella classe A con la keyword virtual e poi ridefinire lo stesso metodo1 nella classe B derivata con le aggiunte che mi servono? A questo punto poi, potrei utilizzare tranquillamente metodo2 mediante classe B ereditato da classe A ed il compilatore automaticamente andrà a stabilire quale metodo1 utilizzare al suo interno in base alla classe che lo chiama? (scusate il gioco di parole :noway: )




Ultima modifica effettuata da McFly il 06/01/2012 alle 18:22
PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Up
3
Down
V
Segnala al moderatore
Postato alle 21:35
Venerdì, 06/01/2012
Si, basta definire metodo1 virtual nella classe A.

Si ho provato e funziona! Però una cosa che non mi torna è che non ho utilizzato i puntatori per applicare il polimorfismo e pure funziona lo stesso! Come mai? - McFly - 07/01/12 12:17
Perchè non è polimorfismo; se hai una classe derivata B che reimplementa alcuni metodi di A, e fai - lumo - 07/01/12 18:50
B b; b.metodo(); il compilatore è già capace di capire quale metodo stai chiamando; invece se tu hai degli oggetti che hanno tutti come base A, chiamare obj->metodo(); è una "chiama polimorfica", e il compotramento del metodo dipende da come è stato implementato nella classe derivata. - lumo - 07/01/12 18:53
@pierotofy: E se si potessero editare i commenti sarebbe meglio - lumo - 07/01/12 18:55


Il mio blog: https://piero.dev
PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 22:18
Venerdì, 06/01/2012
Io farei così:

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2.  
  3. class A
  4. {
  5. public:
  6.     void metodo1()
  7.     {
  8.         std::cout << "Metodo 1 --> A" << std::endl;
  9.     }
  10.  
  11.     void metodo2()
  12.     {
  13.         metodo1();
  14.     }
  15. };
  16.  
  17. class B : public A
  18. {
  19. public:
  20.     void metodo1()
  21.     {
  22.         A::metodo1(); // chiama la funzione membro della classe padre
  23.         std::cout << "Un altro metodo 1 --> B" << std::endl; // altra istruzione
  24.     }
  25.  
  26.     void metodo2()
  27.     {
  28.         metodo1();
  29.     }
  30. };
  31.  
  32.  
  33. int main()
  34. {
  35.     B ().metodo2();
  36.  
  37.     return 0;
  38. }


Ultima modifica effettuata da Pitagora il 06/01/2012 alle 22:33
Non male come soluzione, ma devi ridefinire metodo2 però, invece con virtual si evita questa cosa! A proposito ma nel main B() è un modo short di istanziare una classe? - McFly - 07/01/12 12:16
Semplicemente viene creata un'istanza di B e viene utilizzata; dopo l'utilizzo non sarà più possibile usare quella stessa istanza. - lumo - 07/01/12 18:49
PM