PDA

View Full Version : [C++] ereditarietà con le classi


ghiotto86
07-06-2005, 11:50
vi metto sto codice sorgente

#include <string>
using namespace std;

class Base{
public:
Base(const string &n):nome(n){}
string &get_nome(){return nome;}
private:
string nome;
};

class Derivata:public Base{
public:
Derivata(const string &n):Base(n){}
string &get_nome(){return nome;}
private:
string nome;
};

int main(){

Base b("BASE");
Derivata d("DERIVATA");

cout<<b.get_nome();
cout<<endl;
cout<<d.get_nome();


system("PAUSE");
return 0;
}


perchè mi da come output solo BASE e non anche DERIVATA?????

jappilas
07-06-2005, 12:47
...l' eredita' implica che un oggetto istanza della classe drivata sia anche di classe base, e in effetti, quando lo crei, vengono chiamati tutti i costruttori della catena di derivazione, a ritroso: prima quello della classe Derivata, poi quello della Base

ho come l' impressione il costruttore della Base ricambi il nome dell' oggetto quando allochi il Derivata: non sono sicuro sia una buona idea avere un dato con lo stesso identificatore nella base e nella derivata..

anx721
07-06-2005, 13:16
E' perche il campo nome è stato ridefinito all'interno della classe Derivata e quindi quando il costruttore di Base imposta tale campo sta impostando il campo di Base, mentre l'omonimo campo di Derivata resta non inizializzato. Derivata infatti ridichiara nuovamente il campo nome cosicchè all'interno di Derivata il campo nome di Base viene oscurato da quello di derivata.

Quando invochi il metodo getString sull'oggetto derivato, il metodo ti restituisce il campo di Derivata che è appunto non inizializzato. Non è una buona pratica ridefinire campi, se non veramente necessario.

ghiotto86
07-06-2005, 13:50
avete ragione raga.
errore di distrazione, non riuscivo a capire l'errore.
grazie delle spiegazioni.