Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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++
class A
{
public:
void metodo1();
void metodo2();
};
void A::metodo1()
{
// fa qualcosa
}
void A::metodo2();
{
// fa qualcosa
metodo1();// usa il metodo 1
// fa qualcos'altro ancora
}
Fin qui nessun problema.... ora creo una classe B che eredita da A
Codice sorgente - presumibilmente C/C++
class B : public A
{
// definizione classe B
};
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++
void metodo1()
{ // fa quello che fa nella classe A
// aggiunta istruzioni da fare solo nella classe B
}
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 )
Ultima modifica effettuata da McFly il 06/01/2012 alle 18:22
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
A::metodo1();// chiama la funzione membro della classe padre
std::cout<<"Un altro metodo 1 --> B"<< std::endl;// altra istruzione
}
void metodo2()
{
metodo1();
}
};
int main()
{
B ().metodo2();
return0;
}
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