Diciamo che ho tre classi: A (la madre, astratto), e B e C, i figli di A.implicita conversione vs. static_cast quando upcasting
Quindi B e C ereditare da A (eredità pubblico) . Ho un elenco di puntatori ad A, che compilo con i puntatori di B o C.
La domanda è: qual è lo stile preferito quando si esegue il casting/la conversione?
class A {};
class B : public A {};
class C : public A {};
B* objB = new B();
C* objC = new C();
std::list<A*> myList;
// Option A: static cast conversion
myList.push_back(static_cast<A*> (objB));
myList.push_back(static_cast<A*> (objC));
// Option B: implicit conversion
myList.push_back(objB);
myList.push_back(objC);
// Option C: C-style conversion (I understand that this is evil and must be avoided)
myList.push_back((A*) objB);
myList.push_back((A*) objC);
Quindi, in termini di chiarezza (stile del codice) e in termini di sicurezza, qual è il migliore? Capisco che static_cast è più facile da cercare, ma in questo caso, una conversione implicita dovrebbe essere sufficiente.
Questa è la risposta di cui avevo bisogno. Quindi niente static_cast quando upcasting, ma sì quando downcasting. Grazie! (e una risposta molto veloce!) – fern17
@ fern17 Inoltre, si noti che quando si esegue il downcast, è possibile che non si sappia sempre se si tratta di un B o di un C. Questo è il significato di 'dynamic_cast'. – JorenHeit
Sì, lo so, grazie per renderlo esplicito (per il futuro me che tornerò a questa domanda) – fern17