Sagen wir, ich habe drei Klassen: A (die Mutter, abstrakt) und B und C, die Kinder von A.Implizite Konvertierung vs. static_cast wenn Upcasting
So B und C erben von A (öffentliche Vererbung) . Ich habe eine Liste von Zeigern zu A, die ich mit Zeigern von B oder C bevölkert.
Die Frage ist: Welches ist der bevorzugte Stil beim Casting/Konvertierung?
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);
Also, in Bezug auf die Klarheit (Code-Stil) und in Bezug auf die Sicherheit, welche ist besser? Ich verstehe, dass static_cast einfacher zu suchen ist, aber in diesem Fall sollte eine implizite Konvertierung ausreichen.
Dies ist die Antwort, die ich brauchte. Also kein static_cast beim upcasting, sondern ja beim downcasting. Vielen Dank! (und eine sehr schnelle Antwort!) – fern17
@ fern17 Beachten Sie auch, dass Sie beim Downcasting möglicherweise nicht immer wissen, ob es ein B oder C ist. Dafür steht 'dynamic_cast'. – JorenHeit
Ja, ich weiß, danke, dass du es ausdrückst (für die Zukunft werde ich auf diese Frage zurückkommen) – fern17