Esercizio sull'ereditarietà in C++

Posted in By Joker 0 commenti

Nota: Definizioni tratte dal sito http://www.bo.cnr.it/corsi-di-informatica/corsoCstandard/Lezioni/31Eredita.html

Esistono tre specificatori:
private: (default) indica che tutti i membri seguenti sono privati, e non possono essere ereditati;
public: indica che tutti i membri seguenti sono pubblici, e possono essere ereditati;
protected: indica che tutti i membri seguenti sono protetti, nel senso che sono privati, ma possono essere ereditati;
L'accessibilità dei membri ereditati da una classe base dipende anche dallo "specificatore di accesso alla classe base", che deve essere indicato come nel seguente esempio:

          class Figlio : spec.di accesso Padre  {  ........  } ;
 
dove spec.di accesso può essere: private (default), protected o public (notare l'assenza dei due punti). Ogni membro ereditato avrà l'accesso più "restrittivo" fra il proprio originario e quello indicato dallo specificatore di accesso alla classe base, come è chiarito dalla seguente tabella http://www.bo.cnr.it/corsi-di-informatica/corsoCstandard/Lezioni/31Eredita.html:




Quindi un membro ereditato è pubblico solo se è public nella classe base e l'accesso della classe derivata alla classe base è public.
Se una classe derivata è a sua volta genitrice di una nuova classe, in quest'ultima l'accesso ai membri ereditati è governato dalle stesse regole, che vengono però applicate esclusivamente ai membri della classe "intermedia", indipendentemente da come questi erano nella classe base. In altre parole, ogni classe "vede" la sua diretta genitrice, e non si preoccupa degli altri eventuali "ascendenti".
Normalmente l'accesso alla classe base è public. In alcune circostanze, tuttavia, si può volere che i suoi membri pubblici e protetti, ereditati nella classe derivata, siano accessibili unicamente da funzioni membro e friend della classe derivata stessa: in questo caso, occorre che lo specificatore di accesso alla classe base sia private; analogamente, se si vuole che i membri pubblici e protetti di una classe base siano accessibili unicamente da funzioni membro e friend della classe derivata e di altre eventuali classi derivate da questa,  occorre che lo specificatore di accesso alla classe base sia protected
Esercizio
Creo una sopraclasse di nome Padre e tre sottoclassi di nome Figlio, ognuna di queste sottoclassi però erediterà in modo diverso i membri e gli attributi della classe Padre.   


#include <cstdlib>
#include <iostream>


using namespace std;


class Padre {
public:
int a,b;
int Addizione(){return a+b;};
};


class FiglioPubblico:public Padre {
public:
int Addizione(){return a+b;};
int Sottrazione(){return a-b;};


};


class FiglioPrivato:private Padre {
public:
int Addizione(){return a+b;};
int Sottrazione(){return a-b;};


};


class FiglioProtetto:protected Padre {
public:
int Addizione(){return a+b;};
int Sottrazione(){return a-b;};


};


int main(int argc, char *argv[])
{
FiglioPubblico pubb;
FiglioPrivato priv;
FiglioProtetto prot;


cout<<"Pubblico"<<endl;
cout<<"Inserire a: ";
cin>>pubb.a;
cout<<"Inserire b: ";
cin>>pubb.b;


cout<<"Addizione = "<<pubb.Addizione()<<endl;
cout<<"Sottrazione = "<<pubb.Sottrazione()<<endl;


/*cout<<"Privato"<<endl;
cout<<"Inserire a: ";
cin>>priv.a;
cout<<"Inserire b: ";
cin>>priv.b;


cout<<"Addizione = "<<priv.Addizione()<<endl;
cout<<"Sottrazione = "<<priv.Sottrazione()<<endl;*/


/*cout<<"Protetto"<<endl;
cout<<"Inserire a: ";
cin>>prot.a;
cout<<"Inserire b: ";
cin>>prot.b;


cout<<"Addizione = "<<prot.Addizione()<<endl;
cout<<"Sottrazione = "<<prot.Sottrazione()<<endl;*/




system("PAUSE");
return EXIT_SUCCESS;
}


Ecco il risultato del primo test:
Nel primo test utilizzo lo specificatore public per ereditare dal Padre i suoi membri a e b e il metodo Addizione( ).
Ecco cosa mi compare sullo schermo:
 
Ecco il risultato del secondo test:
Nel secondo test utilizzo lo specificatore private per ereditare dal Padre i suoi membri a e b e il metodo Addizione( ).
Ecco cosa mi compare sullo schermo:



Ecco il risultato del terzo test:
Nel terzo test utilizzo lo specificatore protected per ereditare dal Padre i suoi membri a e b e il metodo Addizione( ).
Ecco cosa mi compare sullo schermo: