Um das Gusssystem zu verstehen, müssen Sie in das Objektmodell eintauchen.
Die klassische Darstellung einer einfachen Hierarchie Modell ist Eindämmungs: dass, wenn B
aus A
leitet dann die B
Objekt tatsächlich ein A
Subobjekt neben eigenen Attribute enthält.
Bei diesem Modell ist Downcasting eine einfache Zeigermanipulation, die durch einen zur Kompilierungszeit bekannten Offset bekannt ist und vom Speicherlayout B
abhängt.
Dies ist, was static_cast tun: eine statische Guss statisch genannt wird, weil die Berechnung von dem, was notwendig ist für die Besetzung zur Compile-Zeit durchgeführt wird, ist es arithmetische oder Conversions Zeiger sein (*).
Allerdings, wenn virtual
Vererbung Kicks in Sachen neigen dazu, ein bisschen schwieriger zu werden. Das Hauptproblem ist, dass mit virtual
Vererbung alle Unterklassen eine gleiche Instanz des Unterobjekts teilen. Um dies zu tun, B
wird einen Zeiger auf eine A
, anstelle einer A
richtig haben, und die A
Basisklasse Objekt wird außerhalb von B
instanziiert werden.
Daher ist es zur Kompilierzeit unmöglich, die notwendige Zeigerarithmetik ableiten zu können: Sie hängt vom Laufzeittyp des Objekts ab.
Wenn eine Laufzeitabhängigkeit besteht, benötigen Sie RTTI (RunTime Type Information), und RTTI für Umwandlungen zu verwenden, ist die Aufgabe dynamic_cast.
Zusammengefasst:
- Kompilierung-gesenkten:
static_cast
- Laufzeit niedergeschlagenen:
dynamic_cast
Die anderen beiden sind auch Kompilierung-Casts, aber sie sind so spezifisch, dass es ist leicht sich daran zu erinnern, wofür sie sind ... und sie sind stinkend, also besser, sie überhaupt nicht zu benutzen.
(*) Wie @curiousguy in den Kommentaren erwähnt, gilt dies nur für Downcasting. Ein static_cast
ermöglicht Upcasting unabhängig von virtueller oder einfacher Vererbung, obwohl dann der Besetzung auch nicht notwendig ist.
Schöne Antwort, die mich verstehen ließ, wie virtuelle Vererbung tatsächlich funktioniert!+1 – undu
Ich mag Ihre Antwort, aber die OP war offenbar gefragt, einen Fehler für Downcast statt Upcasting. – h9uest
@ h9uest: Danke, dass du auf den Ausrutscher hingewiesen hast, ich habe "upcasting" in "downcasting" geändert und jetzt ist alles in Ordnung. –