La classe genitrice è come una scatola compresa entro una scatola più grande che è la classe derivata.
La classe derivata sarà di necessità più grande della genitrice, contenendola.
Immagino la genitrice come una scatola di vetro in parte opaco e in parte trasparente, a seconda che la classe derivata abbia o no accesso ai suoi membri
class Genitrice{
char * privata;
public:
Genitrice(){
privata="sono privata";
}
void metodo(){
cout << privata << endl;
getchar();
}
};
Ecco, qui il membro privata non è visibile all'esterno, ma è visibile dall'interno della classe, anche quando questa è compresa in una "scatola" più grande che è la classe derivata. Dato che il metodo metodo è visibile anche dall'ambiente della scatola più grande, si può fare leva su di esso per agire sul membro privata che è invisibile dall'ambiente della scatola più grande.
Provo a sbizzarrirmi un po'...
#include "iostream" using namespace std; class Genitrice{ char * privata; public: Genitrice(){ privata="sono privata"; } void metodo(){ cout << privata << endl; getchar(); } }; class Derivata:public Genitrice{ public: Derivata():Genitrice(){} void altrometodo(){ cout << "altro metodo" << endl; getchar(); } }; void main(){ Genitrice gen; Derivata der; der.metodo(); }Ecco: la classe derivata non overridda il metodo metodo, per cui quando si chiama il metodo della classe derivata si fa riferimento al contenuto della scatola più piccola che si trova nella parte visibile di essa, il quale ha accesso a tutti i membri della scatola più piccola, e quindi anche alla variabile privata, che si trova nella parte opaca della scatola più piccola.
Adesso, invece, overriddiamo metodo: questo si può paragonare a un taglio operato sulla scatola più piccola, dove viene troncata la parte trasparente dove risiede il metodo metodo e al posto di essa viene messo un analogo metodo metodo appartenente però all'ambiente della scatola più grande, e che quindi non ha accesso alla parte opaca della scatola più piccola.
#include "iostream" using namespace std; class Genitrice{ char * privata; public: Genitrice(){ privata="sono privata"; } void metodo(){ cout << privata << endl; getchar(); } }; class Derivata:public Genitrice{ public: Derivata():Genitrice(){} void metodo(){ cout << privata << endl; getchar(); } void altrometodo(){ cout << "altro metodo" << endl; getchar(); } }; void main(){ Genitrice gen; Derivata der; der.metodo(); }Ottengo l'errore già con l'intelliSense...
Ecco l'output, comunque:
1>c:\users\antonello\documents\visual studio 2010\projects\test1\test1\foglio.cpp(21): error C2248: 'Genitrice::privata': impossibile accedere a private membro dichiarato nella classe 'Genitrice'Certo: perché adesso il metodo metodo si trova nell'ambiente della scatola esterna, e non ha più accesso al membro privata della parte opaca della scatola più piccola, dove invece aveva accesso il metodo non overriddato in quanto appartenente alla scatola più piccola.
Nessun commento:
Posta un commento