Enigma sulla classe base e derivata

di il
8 risposte

Enigma sulla classe base e derivata

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

8 Risposte

  • Re: Enigma sulla classe base e derivata

    Categoria "fuffa" object oriented: vai a cercartele le rogne, se dai lo stesso nome a un membro della classe e a un membro della classe derivata
    
    #include <iostream>
    using namespace std;
    
    
    class R { 
    	protected:
    	int z;
    	int y; 
    	
    	public:
    	R() { R::z = 5; R::y=2;
         		cout << "new R" << endl;
    	};
    	void print(){
         cout << R::z << endl;
         cout << R::y << endl;
         R::z++;
         R::y++;
    	}
    };
    
    
    class S : public R {
    	protected:
    	int y;
    
    	public:
    
    	S() { R::z++; S::y=3;
    			cout << "new S" << endl;
       };
    	void print (){
           cout << S::y << endl;
           S::y++;
           R::z++;
    	};
    	void virtual print1()=0; };
    
    
    class U: public S { 
    	public:
    	U() { R::z=11; S::y=7;
         cout << "new U" << endl;
       };
    	void print (){
           cout << R::z << endl;
           cout << S::y << endl;
           S::y++;
           R::z++;
       };
    	void print1(){
          cout << R::z << endl;
          cout << S::y << endl;
    	};
    };
    
    int main() {
    	U* obj = new U;
    	S* obj1 = obj; 
    	R* obj2 = obj1;
    
    	obj->print(); 
    	obj1->print(); 
    	obj2->print(); 
    	obj1->print1();
    }
    
  • Re: Enigma sulla classe base e derivata

    Sinceramente non capisco tutti questi esempi…

    Se vuoi studiare il comportamento del C++ e poi sottoporli ad un forum almeno fallo con esempi chiari e ridotti, soprattutto con il nome delle variabili/metodi, ma anche della sintassi stessa (member initializer list, mai sentito?)
  • Re: Enigma sulla classe base e derivata

    _Achille ha scritto:


    Sinceramente non capisco tutti questi esempi…

    Se vuoi studiare il comportamento del C++ e poi sottoporli ad un forum almeno fallo con esempi chiari e ridotti, soprattutto con il nome delle variabili/metodi, ma anche della sintassi stessa (member initializer list, mai sentito?)
    Sono esercizi di esame universitari, non sono frutto del sottoscritto, sono fatti apposta per far ragionare sul funzionamento delle classi e quella indicata è la spiegazione che mi sono dato. Spero di averci azzeccato.
  • Re: Enigma sulla classe base e derivata

    Weierstrass ha scritto:


    Categoria "fuffa" object oriented: vai a cercartele le rogne, se dai lo stesso nome a un membro della classe e a un membro della classe derivata
    si chiamano tranelli ! Lo fanno apposta per farti cadere nell'errore i docenti universitari.
  • Re: Enigma sulla classe base e derivata

    zio_mangrovia ha scritto:


    Weierstrass ha scritto:


    Categoria "fuffa" object oriented: vai a cercartele le rogne, se dai lo stesso nome a un membro della classe e a un membro della classe derivata
    si chiamano tranelli ! Lo fanno apposta per farti cadere nell'errore i docenti universitari.
    Bene, studia quello che vuole il professore per l'esame, ma mi raccomando usa classi belle semplici quando sarai al lavoro, che se poi ti beccano che hai perso un mese appresso a bug del genere ti crocefiggono in sala mensa
  • Re: Enigma sulla classe base e derivata

    zio_mangrovia ha scritto:


    Sono esercizi di esame universitari, non sono frutto del sottoscritto, sono fatti apposta per far ragionare sul funzionamento delle classi e quella indicata è la spiegazione che mi sono dato. Spero di averci azzeccato.
    La spiegazione è che R::y e S::y sono due cose diverse: è più chiaro con le chiamate esplicite postate sopra?
  • Re: Enigma sulla classe base e derivata

    Weierstrass ha scritto:


    Bene, studia quello che vuole il professore per l'esame, ma mi raccomando usa classi belle semplici quando sarai al lavoro, che se poi ti beccano che hai perso un mese appresso a bug del genere ti crocefiggono in sala mensa
    Sono già proiettato da un po' nel mondo del lavoro e mi sto ricavando come hobby lo studio Ora capisco a cosa servono le mense.
  • Re: Enigma sulla classe base e derivata

    Weierstrass ha scritto:


    La spiegazione è che R::y e S::y sono due cose diverse: è più chiaro con le chiamate esplicite postate sopra?
    non chiaro, è chiarissimo: questo mi ha tolto definitivamente tutti i dubbi
Devi accedere o registrarti per scrivere nel forum
8 risposte