Die sichere Typumwandlung (type casting) in C++ wird durch die Umwandlungsoperatoren: static_cast, dynamic_cast, const_cast, reinterpret_cast gewährleistet.
nullptr für Zeiger oder wirft eine Ausnahme für Referenzen zurück.Wann verwenden:
dynamic_cast mit virtuellen Basisklassen. Für die Konvertierung zwischen einfachen/kompatiblen Typen verwenden Sie static_cast.Beispiel:
struct Base { virtual ~Base() {} }; struct Derived : Base { void foo() {} }; void test_cast(Base* base) { // Sichere Umwandlung in die abgeleitete Klasse Derived* d = dynamic_cast<Derived*>(base); if (d) { d->foo(); } }
Frage: Kann man ein Objekt der Basisklasse mit static_cast in eine abgeleitete Klasse umwandeln, wenn das Objekt tatsächlich kein Exemplar der abgeleiteten Klasse ist?
Antwort: Ja, static_cast wird kompiliert, aber das Verhalten wird undefiniert sein, wenn das Objekt tatsächlich kein Objekt der abgeleiteten Klasse ist. Nur dynamic_cast garantiert die Sicherheit einer solchen Umwandlung. Die Verwendung von static_cast für Downcasting ist nur zulässig, wenn man sich des tatsächlichen Typs des Objekts sicher ist.
Geschichte
In einem großen Embedded-System wurden Umwandlungen zwischen der Eltern- und Kindklasse über static_cast durchgeführt. In einigen Fällen führte dies zu Abstürzen beim Versuch, auf nicht vorhandene Felder zuzugreifen - das Programm versuchte, Speicher eines anderen Typs zu interpretieren.
Geschichte
Bei der Entwicklung einer Plugin-Architektur verwendeten Programmierer reinterpret_cast für die Umwandlung von Zeigern zwischen verschiedenen Typen, was zu Mülllesungen und Abstürzen zur Laufzeit führte, insbesondere beim Versuch, dynamische Umwandlungen über DLLs vorzunehmen.
Geschichte
Im allgemeinen Unternehmens-Framework wurde die virtuelle Destruktoren in der Basisklasse vergessen, was die ordnungsgemäße Arbeit von dynamic_cast unmöglich machte und zu Speicherlecks und -korruption beim Löschen eines Objekts über einen Zeiger auf die Basisklasse führte.