mercoledì 1 ottobre 2014

Esercizio 29/09/2014 - L'Omonimia dei metodi nel campo dell'Ereditarietà Informatica

L'Omonimia dei metodi nel campo dell'Ereditarietà Informatica

Lo scopo di questa prova è quello di verificare il funzionamento dei metodi all'interno delle classi a cui viene applicato il concetto di Ereditarietà:
Scriveremo un codice molto semplice in cui da una Classe Padre di nome "Generica" ricaveremo una Classe Figlio di nome "Dettaglio"; nella Classe Padre è presente un metodo per la visualizzazione della variabile "a" chiamato "stampa()", nella Classe Figlio (ricavata con modificatore public) avremo invece un metodo per la visualizzazione di una variabile "b" chiamato "stampa1()".
Nell'esempio vedremo come dall'istanza dell'oggetto di nome "Figlio" di Classe "Dettaglio" si possa utilizzare il metodo "stampa()" ereditato e "stampa1()" specifico della nuova Classe:

#include <iostream>
using namespace std;
class Generica{   //dichiarazione della classe Padre Generica
        public:   // con public rendo i metodi accessibili dal main()
        Generica() { a=5; };   //costruttore della Classe Padre Generica
        void stampa() { cout << "Stampa da metodo Padre: " << a << endl; };   
//metodo Padre per visualizzare la variabile a
        private:   // con private rendo i metodi inaccessibili dal main()
        int a;   //dichiarazione dell'attributo intero a
        };

class Dettaglio : public Generica{   
//dichiarazione della classe Figlio Dettaglio con modificatore public dalla classe Padre Generica
        private:   // con private rendo i metodi inaccessibili dal main()
        int b;   //dichiarazione dell'attributo intero b
        public:
        Dettaglio() { b=7; };      //costruttore della Classe Figlio Dettaglio
        void stampa1()   { cout << "Stampa da metodo Figlio: " <<  b << endl; };   
//metodo Figlio per visualizzare la variabile b
        };

int main()
 {
    Dettaglio Figlio;   //istanza dell'oggetto Fiflio di Classe Dettaglio
    Figlio.stampa();   //richiamo metodo stampa Padre
    Figlio.stampa1();   //richiamo metodo stampa1 Figlio
  return 0;

}

Vediamo l'Output così ottenuto:


Come possiamo vedere, in questo caso, viene visualizzato sia l'output dato dal metodo "stampa()" dato dalla Classe Padre, sia l'output dato dal metodo "stampa1()" dato dalla Classe Figlio.
Ora con lo stesso codice andremo a modificare il nome del metodo della Classe Figlio "Dettaglio" utilizzando lo stesso nome del metodo della Classe Padre "Generica" e cioè per entrambi i metodi utilizzeremo il nome stampa():

#include <iostream>
using namespace std;
class Generica{   //dichiarazione della classe Padre Generica
        public:   // con public rendo i metodi accessibili dal main()
        Generica() { a=5; };   //costruttore della Classe Padre Generica
        void stampa() { cout << "Stampa da metodo Padre: " << a << endl; };   //metodo Padre per visualizzare la variabile a
        private:   // con private rendo i metodi inaccessibili dal main()
        int a;   //dichiarazione dell'attributo intero a
        };

class Dettaglio : public Generica{   //dichiarazione della classe Figlio Dettaglio con modificatore public dalla classe Padre Generica
        private:   // con private rendo i metodi inaccessibili dal main()
        int b;   //dichiarazione dell'attributo intero b
        public:
        Dettaglio() { b=7; };      //costruttore della Classe Figlio Dettaglio
        void stampa()   { cout << "Stampa da metodo Figlio: " <<  b << endl; };   //metodo Figlio per visualizzare la variabile b
        };

int main()
 {
    Dettaglio Figlio;   //istanza dell'oggetto Fiflio di Classe Dettaglio
    Figlio.stampa();   //richiamo metodo stampa Padre
    Figlio.stampa();   //richiamo metodo stampa Figlio
  return 0;
}

Vediamo l'Output così ottenuto:


Come evidenziato dalla nostra prova nel momento in cui esiste un metodo della Classe Padre, che viene ereditato nella Classe Figlio, se nella Classe Figlio si andrà a dichiarare un altro metodo con lo stesso nome del metodo ereditato ("stampa()" nel nostro esempio), il compilatore riterrà opportuno fare riferimento al metodo con lo stesso nome più recente e quindi quello presente all'interno della Classe Figlio; da qui l'Output che viene visualizzato produce due volte lo stesso risultato, facendo fede allo stesso metodo stampa() contenuto all'interno della Classe Figlio Dettaglio.

*!* E' importante ricordare che solo l'oggetto si trova nella memoria RAM, non la Classe

Fonti:
Prof. Alemanno

Giacomo Marchesi

Nessun commento:

Posta un commento