PDA

View Full Version : C++ polimorfismo problema.


D3stroyer
04-06-2007, 01:55
ciao a tutti sono ancora qui. Grazie al vostro aiuto nell'altro thread sono in grado di risolvere quello che mi pare ma sono certo che concettualmente io stia sbagliando qualcosa sul polimorfismo. Esempio semplice così capite al volo dove sbaglio.

io creo 2 classi, una base e una derivata che eredita da base.

class BASE {
public:
BASE() : nome("base") {};
virtual void funzione() { cout << nome; };
private:
string nome;
};

class DERIVATA : public BASE {
public:
DERIVATA() : nome("derivata") {};
private:
string nome;
};


nella derivata non ridefinisco funzione() perchè voglio che esegua la stessa cosa quindi faccio senza l'override.

nella main scrivo..

int main() {
DERIVATA prima;
prima.funzione();
}

perchè mi da "base"??

Fino ad oggi per risolvere questo problema copia incollavo la definizione della funzione dalla classe base nella derivata...e tutto andava..ma io la funzione pretendo che la erediti, non voglio riscriverla uguale perchè funzioni!

Grazie a chi mi aiuterà :D

tomminno
04-06-2007, 10:02
perchè mi da "base"??

Fino ad oggi per risolvere questo problema copia incollavo la definizione della funzione dalla classe base nella derivata...e tutto andava..ma io la funzione pretendo che la erediti, non voglio riscriverla uguale perchè funzioni!

Grazie a chi mi aiuterà :D

devi dichiarare "nome" come protected, altrimenti BASE e DERIVATA avranno ognuno la propria variabile e siccome "funzione" è membro di BASE andrà a prendersi "nome" di BASE

D3stroyer
04-06-2007, 10:52
no, un attimo..io voglio che base e derivata abbiano una loro variabile nome, diversa tra loro che però venga richiamata dalla funzione ereditata senza dover riscrivere quest'ultima nella classe derivata.

Con protected continua a fare lo stesso di prima.

D3stroyer
04-06-2007, 11:12
chiedo scusa di non aver capito subito, in ogni caso sapevo che avresti avuto ragione e ho cercato di riprovare piu' volte.

La soluzione del problema è così:

#include <iostream>
#include <string>

using namespace std;

class BASE {
public:
BASE() : nome("base") {};
BASE(string asd) : nome(asd) {};
void funzione() { cout << nome; };
protected:
string nome;
};

class DERIVATA : public BASE {
public:
DERIVATA() : BASE("derivata") {};

};

int main() {
DERIVATA prima;
prima.funzione();
}

ho provato nei temi d'esame e funziona tutto perfettamente, ancora una volta ti ringrazio.

EDIT: scusa, perchè il tutto funziona anche se lascio private i dati nella classe base??

tomminno
04-06-2007, 22:54
EDIT: scusa, perchè il tutto funziona anche se lascio private i dati nella classe base??

Tutto funziona se non devi usare la variabile "nome" all'interno di DERIVATA, visto che avevi dichiarato 2 volte "nome" pensavo che ti servisse usarla anche in DERIVATA.

D3stroyer
05-06-2007, 00:35
non saprei ideare un problema così complicato :asd:

Hardware Upgrade Forum Database Error
Database Error Database error
The Hardware Upgrade Forum database has encountered a problem.

Please try the following:
  • Load the page again by clicking the Refresh button in your web browser.
  • Open the www.hwupgrade.it home page, then try to open another page.
  • Click the Back button to try another link.
The www.hwupgrade.it forum technical staff have been notified of the error, though you may contact them if the problem persists.
 
We apologise for any inconvenience.