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