Newsgroup: it.comp.lang.c++
Titolo: Polimorfismo

//****
//Questo codice stampa sempre "Veicolo", dove sta l'errore?
//****
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
class Veicolo {
    public: virtual void print () {cout << "Veicolo" << endl;}
};
class Auto : public Veicolo {
    public: void print () {cout << "Auto" << endl;}
}
int main () {
    list<Veicolo> *lista = new list<Veicolo>;
    Veicolo v;
    Auto a;
    lista->push_front (v);
    lista->push_front (a);
    string::iterator it;
    for (it = lista.begin (); it != lista.end (); ++it) {
        it->print ();
    }
    return 0;
}
La seconda chiamata a print non dovrebbe richiamare quella di Auto?
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Ovviamente deve essere #include <list> e non <vector> cosi' come using


Devi fare una lista di puntatori a veicolo invece di un puntatore a lista di
veicoli:
 int main () {
     list<Veicolo*> lista;
     Veicolo v;
     Auto a;
     lista.push_front (&v);
     lista.push_front (&a);
     list<Veicolo*>::iterator it; // puo' stare anche dentro il for
     for ( it = lista.begin(); it != lista.end (); ++it) {
         *it -> print ();
     }
     return 0;
 }
...piu' o meno :-)
-- 
Qual'e' il colmo per uno studente-lavoratore?
Avere un quadrato che si crede un rettangolo.

 
-- 
"Infilarti le piume in culo non fa di te una gallina!"

 //****
Almeno potevi provare a compilarlo. Eccoti la versione corretta:
#include <iostream>
#include <list>
using std::cout;
using std::endl;
using std::list;
class Veicolo {
    public: virtual void print () {cout << "Veicolo" << endl;}
};
class Auto : public Veicolo {
    public: void print () {cout << "Auto" << endl;}
};
int main () {
    list<Veicolo*> *lista = new list<Veicolo*>;
    Veicolo v;
    Auto a;
    lista->push_front (&v);
    lista->push_front (&a);
    list<Veicolo*>::iterator it;
    for (it = lista->begin (); it != lista->end (); ++it) {
        (*it)->print ();
    }
    return 0;
}
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

Enrico Maria Giordano wrote:

Giusto un paio di osservazioni:
Perche' allochi la lista dinamicamente ? E tra l'altro ti scordi di
liberarla prima di uscire...
Praticamente usi allocazione su stack e su heap esattamente al contrario
di come andrebbero usati.
Uno dei motivi principali per cui preferire le new all'allocazione
automatica e' proprio il polimorfismo.
Quindi io suggerirei una cosa del genere:
list<Veicolo *> lista;
lista.push_front(new Veicolo);
lista.push_front(new Auto);
ricordandosi in chiusura di cancellare gli elementi della lista.
con qualcosa del genere (non l'ho provato ma dovrebbe funzionare).
  while( ! lista.empty() ) {
    delete *( lista.begin());
    lista.pop_front();
  }
 
Apparentemente e' la stessa cosa, ma, il passo successivo per un programmino
del genere potrebbe essere questo:
void riempiLista(list<Veicolo *>& l) {
  Auto a;
  Veicolo v;
  l.push_front( &a);
  l.push_front( &v);
}
con conseguenze disastrose :-)
In realta' il discorso sarebbe ancora piu' complesso, infatti tenere
puntatori "nudi" nei contenitori e' sempre un problema spinoso, e'
decisamente meglio usare degli smart pointer come boost::shared_ptr<>
(Da evitare invece std::auto_ptr<> in questo contesto).
Saluti,
Fabio
--
I'm Feeling Lucky!

 Giusto un paio di osservazioni:
Ovviamente rivolte all'OP. :-)



Oops, scusa :-)
Ho risposto all'ultimo messaggio del thread 
ma ovviamente mi riferivo all' OP
 
Fabio