[c++] overloading nella classe derivata

Oo.Stud.ssa.oO
Ciao a tutti, sono alle prime armi con la programmazione ad oggetti, e volevo capire bene come si comporta il compilatore di fronte a una classe base e una sua derivata aventi un metodo con lo stesso nome ma implementato diversamente.
In pratica volevo chiarire il significato di "in un eredità public viene sempre chiamata la proprietà applicabile più specifica"
Ho scritto questo codice:
#include <cstdlib>
#include <iostream>

using namespace std;
class Dad{
      public:
             int nome;
             int ctrl;
             int Get(){
                 nome=0;
             };
};
class Son: public Dad{
      int genitore;
      int Get(){
          nome=1;
      };
};
void f1(Dad d){
     d.Get();
}
int main(int argc, char *argv[])
{
    Son s;
    Dad d;
    f1(s);
    cout<<s.nome<<endl;
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Volevo vedere se veniva chiamato il metodo di Dad (nome=0) o il metodo di Son(nome=1).
Il problema è che al campo nome viene attribuito un numero casuale, non viene attribuito o 0 o 1, perchè???

Risposte
vict85
Perché f1 non cambia s.

Oo.Stud.ssa.oO
Come non la cambia? Io gli passo come parametro Dad d, e su d chiamo il metodo Get() che cambia il nome..

vict85
Ti suggerisco di ripassarti la parte del passaggio di parametri per valore e per riferimento.

Oo.Stud.ssa.oO
Grazie vict85, problema risolto:

#include <cstdlib>
#include <iostream>

using namespace std;
class Dad{
      public:
             int nome;
             int ctrl;
             virtual int Get(){
                 nome=0;
             };
};
class Son: public Dad{
      int genitore;
      int Get(){
          nome=1;
      };
};
void f1(Dad *d){
     d->Get();
}
int main(int argc, char *argv[])
{
    Son* s;
    s=new Son;
    f1(s);
    cout<<s->nome<<endl;
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.