Classi derivate

di il
4 risposte

Classi derivate

#include <iostream>
using namespace std;

class A{
       protected:
            int x; int y;
        public:
            A(){ x=1, y=2; };
            void stampa () {cout << x << '\t' << y << endl; };
};

class B: public A
{
        int y;
    public:
        B() { x=3; y=4; };
};

int main(){
   B* obj = new B; 
   obj->stampa(); 
}

C'e una cosa che ancora non riesco a capire:
Prima che venga invocata la funzione stampa abbiamo nella classe A x=3, y=2 mentre la classe B x=3, y=4
Possiamo dire che x è un'area condivisa per entrambe le classi mentre y ha una porzione di memoria dedicata alla classe A ed una alla B.
La classe B eredità la funzione membro stampa() ma NON capisco perchè quando viene invocata da obj->stampa() , quindi attraverso il puntatore obj che si riferisce alla classe B, perchè viene stampato il valore y=2 che appartiene alla classe A mentre viene invocata la funzione "ereditata" all'interno della classe B. Dove fa acqua il mio ragionamento?

4 Risposte

  • Re: Classi derivate

    Stampa è un metodo di A: il codice che hai scritto per A deve compilare anche se B non esistesse proprio, quindi è pacifico che debba essere inviato A::y nella cout. Diverso il caso in cui il metodo venisse dichiarato virtual, ma in quel caso verrebbe proprio eseguito il metodo con lo stesso nome presente nella classe derivata, quindi A::stampa() non verrebbe chiamato proprio. Ma nel tuo caso B::stampa() non esiste nemmeno
  • Re: Classi derivate

    Weierstrass ha scritto:


    Stampa è un metodo di A: il codice che hai scritto per A deve compilare anche se B non esistesse proprio, quindi è pacifico che debba essere inviato A::y nella cout. Diverso il caso in cui il metodo venisse dichiarato virtual, ma in quel caso verrebbe proprio eseguito il metodo con lo stesso nome presente nella classe derivata, quindi A::stampa() non verrebbe chiamato proprio. Ma nel tuo caso B::stampa() non esiste nemmeno
    Mettendo da parte le funzioni virtual allora mi sfugge il concetto di classe derivata, in quanto sia x che il metodo stampa() vengono ereditati dalla classe B per cui pensavo che la chiamata obj->stampa() invocasse B::stampa() (anche se non c'e' la dichiarazione, stampa() è ereditata) e credevo che B::stampa() accedesse, perdonatemi il termine, al suo ambiente (x,y di cui ha visibilità).
  • Re: Classi derivate

    Usa un debugger con watch+dissembly, controlla quello che succede davvero sul computer e vedrai che tutti i tuoi dubbi scompariranno. obj è un'istanza di B costituita da A::x, A::y, A::stampa() e B::y

    Io onestamente non li capisco i professori che insistono su questi aspetti secondari della programmazione orientata agli oggetti senza far vedere quello che fa davvero il compilatore. Infatti sto notando che le nuove leve arrivano al lavoro con le idee sempre più confuse
  • Re: Classi derivate

    Di nuovo grazie
Devi accedere o registrarti per scrivere nel forum
4 risposte