Newsgroup: it.comp.lang.c++
Titolo: ereditarieta', upcasting & liste

La situazione e' questa:
3 classi:
Veicolo (classe base), Automobile (derivata da Veicolo) e Motocicletta
(derivata da Veicolo anch'essa).
Creo le istanze di automobile e motocicletta e le metto in una lista di
Veicoli.
A questo punto accedendo ad un elemento di questa lista (ad un Veicolo
quindi) c'e' ancora modo di sapere se e' un Automobile o una Motocicletta ?
--
Visita la mia pagina personale:
 
http://members.xoom.it/Ake
*** grafica - ingegneria - midi - humour ***
****  abandonware - emulatori - MUD ****
 ***             DragonBall / Z                ****
Il Covo di Ake ora e' anche senza fili,
visitalo con il tuo cellulare WAP a:
 
tagtag.com/ake

 quindi) c'e' ancora modo di sapere se e' un Automobile o una Motocicletta ?
Si, usando ad esempio l'operatore dynamic_cast .
Veicolo * v = new Motocicletta;
Motocicletta * m = dynamic_cast<Motocicletta *>(v);
if ( m != 0 )
  ; // era davvero una moto
else
  ; // era qualcos'altro
Ciao,
Nicola

 writes:

Attenzione!  Ake parla di liste...  Quello che dici tu e' esatto; ma
se lui cerca di applicarlo alla cieca puo' avere problemi.  Tutto
dipende infatti da come la lista e' stata definita.
Nelle std::list ogni volta che inserisci un elemento non si tratta
dell'oggetto originale, ma di una copia; e quindi viene richiamato,
per l'inserzione, il copy ctor.  Se e' una std::list<Veicolo>, viene
chiamato il copy ctor dei Veicoli (in fin dei conti tu vuoi una lista
di Veicoli, una Automobile E'-UN Veicolo, ed il tutto fa senso); ma la
parte specifica delle Automobili o Motociclette non viene copiata, ed
il dynamic_cast non funziona perche' nella lista c'e' un _vero_
Veicolo e non un oggetto derivato.
Se invece e' una std::list<Veicolo *>, quello che inserisci e' un
puntatore all'oggetto originale (e non ad una copia); e l'operatore di
dynamic_cast funziona.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it
The instructions said to use Windows 98 or better - so I installed FreeBSD.

 wrote in message
rmd7av8...@mlinux.pd.infn.it...


 edito il flag...e' un po' rozzo ma dovrebbe andare no?
Se sei convinto di voler mettere nella stessa lista veicoli di tipo
diverso puoi usare
#include <list>
std::list<Veicolo *> veicoli;
In molti casi l'esigenza di recuperare il tipo specifico dell'oggetto
indirizzato e' meglio risolta introducendo delle opportune funzioni
membro virtuali, in modo da lasciare che sia il linguaggio a scegliere
quella giusta, invece di codificare una selezione esplicita.
Ciao,
Nicola

 Nicola


Ciao,
anche io uso msvc++ versione 6 pero´, non so la tua.
e il file list lo dovresti trovare nel folder sotto Program Files\Microsoft
Visual Studio\Vc98\Include, ed e´ un header file che deve esistere in un
compilatore C++ standard.
Controlla quindi la versione del tuo compilatore perche´ se non hai questo
header file vuol dire che e´ vecchia e non standard, quindi ti converra´
aggiornarla.
Mauro

In effetti io ho il msvc40..e quella libreria non c'e'...DOH!! :)
Maurus <REMOVE...@rocketmail.com-REMOVE> wrote in message
9a9sqg$g5b$1...@newstoo.ericsson.se...


 
Ma questo sistema non funziona solo se sono definite funzioni virtuali ?
Ho fatto alcuni test con il gcc (2.95.2 ) e confermano questa mia ipotesi, 
ma non ho trovato nulla sullo standard ( ma e' probabile che non so cercare 
... ).
Il gcc non mi compila se applico dinamyc_cast<>() ad una classe/struttura 
base per ottenere una derivata senza metodi virtuali...

"Goffredo Baroncelli" <krei...@earthling.net.antispam> wrote in message
news:q21ga9...@therra.bhome...

Hanno ragione i compilatori. Nel caso del downcasting (da base a derivata)
dynamic_cast si applica solo a tipi polimorfici, a meno che non casti un
puntatore a null. Non invece nel caso di upcasting (da derivata a base).
Se non hai trovato nulla sullo standard mi sa proprio che non sai cercare, dato
che in questo caso non e' necessario neppure "saltare" da una parte all'altra
dello stesso. Trovi tutto nel posto piu' ovvio: 5.2.7 Dynamic cast
[expr.dynamic.cast].
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 ... ).
Certamente. Ho dato per scontato che *almeno* il distruttore di Veicolo
fosse definito come virtuale. Altrimenti il dynamic_cast e' l'ultimo dei
problemi.
Ciao,
Nicola