Downcasting mit dem static_cast-Operator: Undefiniertes Verhalten entmystifizieren
Bedenken Sie das folgende Problem:
class base { base(); virtual void func(); }; class derived : public base { derived(); void func(); void func_d(); int a; }; int main() { base *b = new base(); sizeof(*b); // Gives 4. derived *d = static_cast<derived*>(b); sizeof(*d); // Gives 8 - means whole derived obj size...why? d->func_d(); }
In diesem Szenario , das Umwandeln des Basiszeigers in einen abgeleiteten Zeiger mithilfe von static_cast hat anscheinend den Zugriff auf die gesamte Größe und Größe des abgeleiteten Objekts ermöglicht Funktion. Dies wirft jedoch die Frage auf: Wie ist das möglich, wenn der Basiszeiger ursprünglich auf ein bestimmtes Basisobjekt zeigte?
Das undefinierte Verhalten verstehen
Die Antwort liegt in der Natur von static_cast und seine Auswirkung auf dynamische Objekte. Das Downcasting mit static_cast auf einen Typ, den das Objekt tatsächlich nicht hat, wird als undefiniertes Verhalten klassifiziert. Die Folgen undefinierten Verhaltens können dramatisch variieren, einschließlich des Ermöglichens eines unerwarteten Zugriffs auf die abgeleitete Klassenmitgliedsfunktion func_d() in diesem Fall.
Die Regel des Downcasting
Gemäß Im C-Standard (Abschnitt 5.2.9) folgt das Downcasting mit static_cast einer bestimmten Regel:
In unserem Beispiel:
Der unerwartete Erfolg des Aufrufs von d->func_d() ist eine Folge dieses undefinierten Verhaltens. Verlassen Sie sich nicht auf die Möglichkeit, nach einem unsicheren Downcast auf abgeleitete Klassenmitglieder zuzugreifen.
Das obige ist der detaillierte Inhalt vonWie kann „static_cast' scheinbar den Zugriff auf die Mitglieder einer abgeleiteten Klasse ermöglichen, wenn ein Basiszeiger auf ein bestimmtes Basisobjekt heruntergestuft wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!