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