Veilige typeconversie (type casting) in C++ wordt gegarandeerd door de conversieoperatoren: static_cast, dynamic_cast, const_cast, reinterpret_cast.
nullptr voor pointers of gooit het een uitzondering voor referenties.Wanneer te gebruiken:
dynamic_cast met virtuele basisklassen. Voor conversie tussen eenvoudige/compatibele types — static_cast.Voorbeeld:
struct Base { virtual ~Base() {} }; struct Derived : Base { void foo() {} }; void test_cast(Base* base) { // Veilige conversie naar een afgeleide klasse Derived* d = dynamic_cast<Derived*>(base); if (d) { d->foo(); } }
Vraag: Kan een object van de basisklasse worden geconverteerd naar de afgeleide met static_cast, als het object in werkelijkheid geen instantie is van de afgeleide klasse?
Antwoord: Ja, static_cast compileert, maar het gedrag zal onbepaald zijn als het object niet daadwerkelijk een object van de afgeleide klasse is. Alleen dynamic_cast garandeert de veiligheid van zo'n conversie. Het gebruik van static_cast voor downcast is alleen toegestaan als je zeker bent van het werkelijke type van het object.
Verhaal
In een groot embedded-systeem werden casts tussen de ouder- en kindklasse gedaan met static_cast. In sommige gevallen leidde dit tot crashes bij het proberen toegang te krijgen tot niet-bestaande velden - het programma probeerde het geheugen van een ander type te interpreteren.
Verhaal
Bij het ontwikkelen van een plug-inarchitectuur gebruikten programmeurs reinterpret_cast voor het casten van pointers tussen verschillende types, wat leidde tot het lezen van afval en crashes tijdens runtime, vooral bij pogingen tot dynamische conversie via DLL.
Verhaal
In een algemeen bedrijfsframework vergaten ze virtuele destructors in de basisklasse, waardoor een correcte werking van dynamic_cast onmogelijk was en leidde tot memory leaks en corruptie bij het verwijderen van een object via een pointer naar de basisklasse.