Sono giorni che cerco di capire d solo il comportamento di un particolare valore dell'output del seguente codice:
[CODE]#include <iostream>
using namespace std;
class R {
protected:
int z;
int y;
public:
R() { z = 5; y=2;
cout << "new R" << endl;
};
void print(){
cout << z << endl;
cout << y << endl;
z++;
y++;
}
};
class S : public R {
protected:
int y;
public:
S() { z++; y=3;
cout << "new S" << endl;
};
void print (){
cout << y << endl;
y++;
z++;
};
void virtual print1()=0; };
class U: public S {
public:
U() { z=11; y=7;
cout << "new U" << endl;
};
void print (){
cout << z << endl;
cout << y << endl;
y++;
z++;
};
void print1(){
cout << z << endl;
cout << y << endl;
};
};
int main() {
U* obj = new U;
S* obj1 = obj;
R* obj2 = obj1;
obj->print();
obj1->print();
obj2->print();
obj1->print1();
}
RISULTATO:
new R
new S
new U
11
7
8
13
2
14
9
Il mio dubbio è sul valore 2 dell'output,
Secondo me l'istruzione ob2->print() richiama il metodo print() della classe R, sto utilizzando il puntatore obj2 (di tipo classe base R) per puntare all'oggetto classe derivata U quindi mi aspettavo che venisse stampato come z e y i valori di 13 e 9 mentre per y stampa magicamente "2" e non lo capisco.
Forse la spiegazione devo cercarla nella classe Y dove c'e' la dichiarazione del membro y (int y) che viene ereditato dalla classe U, per cui quando accedo ad un oggetto U (classe derivata) tramite puntatore alla classe R (classe base) perdo questa informazione (y) ed utilizzo quella di R. E' giusta la mia deduzione ? Altrimenti mi arrendo.
Ho fatto la stampa dei puntatori obj, obj1 e obj2 e vedo che sia obj che obj1 puntano allo stesso oggetto e mi torna, mentre obj2 punta ad un indirizzo diverso, forse perchè questo a ciò che ho prima descritto ? Sarebbe interessante capire come è organizzato in memoria perchè non ho afferrato bene il concetto.
Grazie