sabato 9 agosto 2014

Ripasso sui membri privati della classe genitrice.

Ripassiamo queste eventualità, cercando di schematizzare:
  1. la classe Genitrice ha una proprietà privata;
    1. accesso da un metodo della classe Genitrice;
    2. accesso da un metodo della classe Derivata
    3. accesso da un metodo della classe Derivata che overridda un metodo della classe Genitrice.
  2. la classe Genitrice ha una proprietà privata e la classe Derivata ha una proprietà con lo stesso nome:
    1. accesso da un metodo della classe Genitrice;
    2. accesso da un metodo della classe Derivata;
    3. accesso da un metodo della classe Derivata che overridda un metodo della classe Genitrice.
Ripassiamo queste:

La classe Genitrice ha una proprietà privata: ne saggiamo l'accesso da un metodo della classe Genitrice
#include "iostream"
using namespace std;


class Genitrice{
  char * proprieta;
public:
 Genitrice(){
 proprieta="io sono la proprieta' della genitrice";
 }
void metodoGen(){
 cout << "io sono il metodo della genitrice, " << proprieta << endl;
 getchar();
 }
};

class Derivata:public Genitrice{
public:
 Derivata():Genitrice(){
 }
};

void main(){
 Genitrice Gen;
 Derivata der;
 Gen.metodoGen();
} 
io sono il metodo della genitrice, io sono la proprieta' della genitrice


Dicendo "io sono il metodo della genitrice" si esprime il fatto che è stato chiamato il metodo della classe Genitrice; dicendo "io sono la proprietà della genitrice" si esprime il fatto che il metodo ha messo a video la proprietà della classe Genitrice.
La classe Genitrice ha una proprietà privata: ne saggiamo l'accesso da un metodo della classe Derivata
#include "iostream"
using namespace std;


class Genitrice{
  char * proprieta;
public:
 Genitrice(){
 proprieta="io sono la proprieta' della genitrice";
 }
void metodoGen(){
 cout << "io sono il metodo della genitrice, " << proprieta << endl;
 getchar();
 }
};

class Derivata:public Genitrice{
public:
 Derivata():Genitrice(){
 }
 void metodoDer(){
  cout << "Io sono il metodo della derivata, " << proprieta << endl;
 }

};

void main(){
 Genitrice Gen;
 Derivata der;
 der.metodoDer();
} 
1>c:\users\antonello\documents\visual studio 2010\projects\test1\test1\foglio.cpp(22): error C2248: 'Genitrice::proprieta': impossibile accedere a private membro dichiarato nella classe 'Genitrice'
Ecco, in questo caso, essendo la proprietà privata della classe Genitrice, il metodo della classe Derivata non la vede.
Ma dal momento che il metodo della classe Genitrice è ereditato dalla classe Derivata, posso chiamare questo metodo anche dalla classe Derivata:
void main(){
 Genitrice Gen;
 Derivata der;
 der.metodoGen();
}
io sono il metodo della genitrice, io sono la proprieta' della genitrice


Ho dovuto togliere il metodo metodoDer() in quanto avevo un codice di errore in quanto la definizione del metodo fa riferimento a una proprietà inaccessibile.
La classe Genitrice ha una proprietà privata: ne saggiamo l'accesso da un metodo della classe Derivata che overridda un metodo con lo stesso nome della classe Genitrice.
#include "iostream"
using namespace std;


class Genitrice{
  char * proprieta;
public:
 Genitrice(){
 proprieta="io sono la proprieta' della genitrice";
 }
void metodo(){
 cout << "io sono il metodo della genitrice, " << proprieta << endl;
 getchar();
 }
};

class Derivata:public Genitrice{
public:
 Derivata():Genitrice(){
 }
 void metodo(){
 cout << "io sono il metodo della derivata, " << proprieta << endl;
 getchar();
 }

};

void main(){
 Genitrice Gen;
 Derivata der;
 der.metodo();
}
1>c:\users\antonello\documents\visual studio 2010\projects\test1\test1\foglio.cpp(22): error C2248: 'Genitrice::proprieta': impossibile accedere a private membro dichiarato nella classe 'Genitrice'
Era ovvio: già nella definizione del metodo l'intellisense dà errore per membro inaccessibile.
Dunque la classe Derivata non può overriddare: se si elimina la definizione del metodo nella classe Derivata è:
io sono il metodo della genitrice, io sono la proprieta' della genitrice



L'overriding zittisce il metodo della classe genitrice.

Nessun commento:

Posta un commento