So ein bisschen mehr über die Unterschiede zwischen C-style-wirft, ich versuche static_cast, dynamic_cast und ich beschlossen, zu lernen um zu versuchen, dieses Beispiel, das die Unterschiede zwischen C-style-wirft und static_cast ziemlich gut widerspiegelt.Methodenaufruf nach ungültigen C-Casts arbeitet
class B
{
public:
void hi() { cout << "hello" << endl; }
};
class D: public B {};
class A {};
int main()
{
A* a = new A();
B* b = (B*)a;
b->hi();
}
Gut, der Code-Snippet sollte bedenken, daß die C-Stil Guss sehr schief geht und die schlechte Besetzung ist nicht nachgewiesen. Teilweise passiert es so. Die schlechte Besetzung wird nicht erkannt, aber ich war überrascht, als das Programm, statt bei b->hi();
abstürzt, es auf dem Bildschirm das Wort "Hallo" gedruckt.
Nun, warum passiert das? Welches Objekt wurde verwendet, um eine solche Methode aufzurufen, wenn kein B-Objekt instanziiert ist? Ich verwende g ++ zum kompilieren.
Casting zu einem nicht verwandten Typ wie diesem (was in C++ effektiv 'reinterpret_cast' ist) ist undefiniertes Verhalten. Dies bedeutet, dass die Implementierung tun kann, was sie will. – Yuushi
TIPP: selbst eine kaputte Uhr zeigt zweimal am Tag die richtige Zeit. –
Ein C-Style-Cast ist genau so, wie der Programmierer dem Compiler sagt: "Vertrau mir, das ist B-Objekt". Der Compiler hat keine andere Wahl, als sich zu fügen. Was passiert, wenn es läuft, ist nicht definiert. Dies ist genau der Grund, warum C-Style-Casts so gefährlich sind. –