La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a. 2001-2002 - 4° Ciclo Polimorfismo.

Presentazioni simili


Presentazione sul tema: "1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a. 2001-2002 - 4° Ciclo Polimorfismo."— Transcript della presentazione:

1 1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a. 2001-2002 - 4° Ciclo Polimorfismo

2 2 Definizione Il polimorfismo è la capacità che hanno oggetti di classi diverse ma correlate per il fatto di derivare da una classe base comune di rispondere ciascuno in maniera diversa ad uno stesso messaggio. Lo stesso messaggio inviato a diversi tipi di oggetti assume quindi diverse forme, da cui il termine polimorfismo. Il polimorfismo si implementa tramite le funzioni virtuali.

3 3 Polimorfismo Funzioni virtuali Nell’ambito della definizione delle classi base e derivate una funzione virtuale, pur mantenendo la stessa interfaccia, ha implementazioni diverse da classe a classe e deve essere dichiarata virtuale nel seguente modo: virtual Prototipo_Funzione_Virtuale; Le varie implementazioni della funzione virtuale possono essere richiamate con la tecnica del binding (legame) statico, che si realizza nel momento della compilazione del programma, ricorrendo agli oggetti delle corrispondenti classi, ossia operando come segue: …. Nome_Oggetto. Invocazione_Funzione_Virtuale;

4 4 Polimorfismo Esempio: class Punto { public:Punto (int x=0, int y=0); virtual void print ( ); private:int x, y;}; Punto::Punto (int a, int b) {x=a; y=b;} void Punto::print ( ) {cout<< “\n” << x<<“, “<<y;} class Segmento: public Punto { public:Segmento (int x=0, int y=0, int x1=0, int y1=0); virtual void print ( ); private:int x1, y1}; Segmento::Segmento (int c, int d, int e, int f) :Punto (c, d) { x1=e; y1=f;} void Segmento::print ( ) {cout<<x1<<“, “<<y1<<“\n”;}

5 5 Polimorfismo int main ( ) { Punto p1(1, 2), p2(3, 4); Segmento s1(5, 6, 7, 8); p1.print ( ); p2.print ( ); s1.print ( ); return 0;} Stampe eseguite: 1, 2 3, 4 7, 8

6 6 Polimorfismo Richiamo della funzione virtuale di classe base La funzione virtuale di classe base può svolgere delle operazioni che sono comuni a più classi derivate. Può quindi risultare comoda la sua invocazione da parte delle funzioni virtuali delle classi derivate. Poiché queste funzioni si trovano in una situazione di overriding è bene ricordare che, nell’implementazione delle funzioni virtuali derivate, la funzione virtuale di classe base può essere invocata solo facendo ricorso al nome della classe base ed all’operatore binario di risoluzione dello scope, ossia: …...Nome_Classe_Base :: Invocazione_Funzione_Virtuale;

7 7 Polimorfismo class Punto { public:Punto (int x=0, int y=0); virtual void print ( ); private:int x, y;}; Punto::Punto (int a, int b) {x=a; y=b;} void Punto::print ( ) {cout <<“\n” <<x<<“, “<<y;} class Segmento: public Punto { public:Segmento (int x=0, int y=0, int x1=0, int y1=0); virtual void print ( ); private:int x1, y1}; Segmento::Segmento (int c, int d, int e, int f) :Punto (c, d) { x1=e; y1=f;} void Segmento::print ( ) {Punto::print( ); cout <<“, “ <<x1<<“, “ <<y1<<“\n”;}

8 8 Polimorfismo int main ( ) { Punto p1(1, 2), p2(3, 4); Segmento s1(5, 6, 7, 8); p1.print ( ); p2.print ( ); s1.print ( ); return 0;} Stampe eseguite: 1, 2 3, 4 5, 6, 7, 8

9 9 Polimorfismo Binding dinamico (via puntatore) Se ad un puntatore di classe base si assegna un valore di puntatore di un oggetto di una classe derivata, l’invocazione della funzione virtuale eseguita per mezzo del puntatore comporta l’esecuzione della funzione virtuale della classe derivata a cui appartiene l’oggetto. In questo caso il legame tra oggetto e funzione eseguita, viene realizzato in modo dinamico, ossia non al momento della compilazione del programma, ma della sua esecuzione e, quindi, si parla in questo caso di binding dinamico. Questo meccanismo realizza il vero polimorfismo poiché lo stesso messaggio, ossia l’invocazione della funzione virtuale per mezzo di un puntatore di classe base, comporta l’esecuzione di diverse implementazioni a seconda dell’oggetto a cui è inviato.

10 10 Polimorfismo Esempio (vedi classi Punto e Segmento) int main ( ) { Punto p1(1, 2), p2(3, 4), *punPtr; Segmento s1(5, 6, 7, 8), s2(1, 2, 3, 4); punPtr= &s1; punPtr->print ( ); punPtr= &s2; punPtr->print ( ); return 0;} Stampe eseguite: 5, 6, 7, 8 1, 2, 3, 4

11 11 Polimorfismo Binding dinamico (via riferimento) Lo stesso comportamento dinamico può essere ottenuto anche con i riferimenti, ossia: Se definiamo un riferimento alla classe base e gli assegniamo un oggetto di una classe derivata, l’invocazione della funzione virtuale eseguita ricorrendo al riferimento di classe base comporta l’esecuzione della funzione virtuale della classe derivata a cui appartiene l’oggetto assegnato al riferimento di classe base.

12 12 Polimorfismo Esempio (vedi classi Punto e Segmento) int main ( ) { Punto p1(1, 2), p2(3, 4), &punRif; Segmento s1(5, 6, 7, 8), s2(1, 2, 3, 4); punRif= s1; punRif.print ( ); punRif= s2; punRif.print ( ); return 0;} Stampe eseguite: 5, 6, 7, 8 1, 2, 3, 4

13 13 Polimorfismo Classi base astratte Le classi base astratte sono quelle che contengono una o più funzioni virtuali pure, ossia contenenti l’inizializzazione “=0” nella dichiarazione: virtual Prototipo_Funzione_Virtuale =0; Le funzioni virtuali pure non hanno una implementazione nella classe base, ma in essa definiscono solo, tramite il prototipo, una particolare interfaccia. Per questa ragione una classe base astratta non ammette l’istanziazione di oggetti.

14 14 Polimorfismo Funzioni derivate concrete Una funzione virtuale pura viene definita quando non ha senso una sua qualsiasi implementazione per la classe base, mentre hanno senso le implementazioni per le classi derivate. Le classi derivate devono contenere la dichiarazione virtual della funzione, ma non l’inizializzazione “=0”. Se una classe derivata non contiene però la sua implementazione della funzione, diventa anch’essa una classe astratta. Le classi derivate che contengono le rispettive implementazioni della funzione dichiarata pura nella classe da cui derivano, vengono dette concrete.

15 15 Polimorfismo Distruttori virtuali In una classe base con funzioni virtuali è bene definire virtuale anche il distruttore e utilizzare la stessa definizione di virtuale anche per tutti i distruttori delle classi derivate. In questo caso, se un oggetto viene distrutto esplicitamente con l’operatore delete applicato ad un puntatore del tipo della classe base a cui è stato assegnato il valore del puntatore all’oggetto, verrà distrutto l’oggetto corretto (compresa la sua componente di classe base) perché anche in questo caso, malgrado i distruttori abbiano denominazioni diverse, si applica il binding dinamico.


Scaricare ppt "1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a. 2001-2002 - 4° Ciclo Polimorfismo."

Presentazioni simili


Annunci Google