Innanzitutto grazie della risposta.Originariamente inviato da shodan
Usa dynamic_pointer_cast<>
Oppurecodice:for (list<spBase_t>::iterator i = l.begin(); i!= l.end(); i++) { spDerived_t sd = dynamic_pointer_cast<Derived>(*i); sd->print(); }
Se però il nuovo puntatore è nullo, hai un errore di accesso.codice:for (list<spBase_t>::iterator i = l.begin(); i!= l.end(); i++) { dynamic_pointer_cast<Derived>(*i)->print(); }
In realtà avevo già provato con il dynamic_pointer_cast, ma il compilatore mi restituisce
/usr/include/c++/4.2.1/tr1/boost_shared_ptr.h:613: error: cannot dynamic_cast ‘__r->std::tr1::__shared_ptr<Base, _S_atomic>::_M_ptr’ (of type ‘class Base* const’) to type ‘class Derived*’ (source type is not polymorphic)
Come puoi vedere non ho metodi polimorfici: potrei potenzialmente avere diverse classi derivate dalla medesima base ma con metodi molto diversi tra di loro.
Il motivo per cui mi serve passare dalla medesima classe base è perché, in questo modo, potrei utilizzare il container 'list', dato che mi serve mantenere una lista di oggetti appartenenti a classi diverse. All'occorrenza, iterando su questa lista e riconoscendo il tipo di oggetto, effettuo il cast opportuno e lancio i diversi metodi secondo la logica del mio programma.
Grazie

Rispondi quotando