Meglio fare un po' di chiarezza.Originariamente inviato da ziobacco
Grazie, ora funziona, ma solo se metto: (*i)->getTipo().
[/CODE]
Si, errore mio, scusa.
[QUOTE}
Inoltre volevo chiederti: se Compressione ha un attributo (con metodi associati set e get) che Proprietà non ha e non conviene fare il casting, metto come virtual i metodi che permettono di accedere all'attributo in Proprietà? E se una proprietà deve ridefinire quel metodo?
Grazie.
Ciao.
Proprieta espone un'interfaccia di metodi che Compressione eredita ed eventualmente ridefinisce. Quando si invocano tali metodi tramite un puntatore (o reference) non è necessario un cast per farlo: il compilatore richiamerà comunque la funzione corretta. Se tu inserisci in Compressione un metodo proprio, quindi non ereditatato da Proprieta, questo non è richiamabile se non con un cast esplicito. Questo perché Proprieta (di fatto) è un sotto insieme dell'interfaccia di Compressione.
In questo caso è necessario si un cast, ma occorre fare molta attenzione.
Se hai una sola relazione di ereditarietà ( Compressione -> Proprieta ), il cast è corretto, ma se ne hai più di una (AltroTipo -> Proprieta) hai un crash. Questo perché Compressione e AltroTipo sono due cose diverse.
Il C++ mette a disposizione il dynamic_cast<> per operazioni di downcasting. Tu, che hai messo un getTipo(), puoi agire diversamente.
Supponendo di avere due classi derivate entrambe da Propieta, puoi fare.
In questo modo avrai la classe corretta sulla quale invocare il metodo personale.codice:std::list<Proprieta*> prop = struttura.getListaProprieta(); for (i = prop.begin(); i != prop.end(); ++i) { if ((*i)->getTipo() == 'A' ) { static_cast<Compressione*>(*i)->metodo_di_compressione( /* params */) } if ((*i)->getTipo() == 'B' ) { static_cast<AltroTipo*>(*i)->metodo_di_altro_tipo( /* params */) } }