Heim >Backend-Entwicklung >C++ >Wann ist die Verwendung von „static_cast' für Downcasting in C undefiniertes Verhalten?
Downcasting mit Static_cast in C
Downcasting ist eine Technik, die in der objektorientierten Programmierung verwendet wird, um einen Basisklassenzeiger oder eine Referenz auf eine abgeleitete Klasse umzuwandeln Klassenzeiger oder Referenz. In C kann dies mit dem static_cast-Operator erreicht werden.
Betrachten Sie das folgende Codebeispiel:
class Base { public: Base() {} virtual void func(); }; class Derived : public Base { public: Derived() {} void func(); void func_d(); int a; }; int main() { Base *b = new Base(); std::cout << sizeof(*b) << std::endl; // Prints 4 Derived *d = static_cast<Derived *>(b); std::cout << sizeof(*d) << std::endl; // Prints 8 d->func_d(); }
In diesem Beispiel wird ein Zeiger vom Typ Base erstellt und mit einem Objekt von initialisiert Typ Basis. Der sizeof-Operator gibt 4 zurück und gibt die Größe des Basisobjekts an.
Wenn wir jedoch versuchen, b mithilfe von static_cast in einen Zeiger vom Typ Derived umzuwandeln und ihn d zuzuweisen, wird die Größe von *d zu 8. Dies ist die Größe eines abgeleiteten Objekts. Dieses Verhalten ist unerwartet, da wir normalerweise erwarten würden, dass die Größe von *d mit der von *b übereinstimmt.
Der Grund für dieses Verhalten liegt im Konzept des undefinierten Verhaltens (UB). Die Verwendung von static_cast zum Umwandeln eines Objekts in einen Typ, den es eigentlich nicht hat, ergibt UB. In diesem Fall zeigt b auf ein Basisobjekt und nicht auf ein abgeleitetes Objekt. Static_cast kann den zugrunde liegenden Typ des Objekts nicht ändern und daher ist das Ergebnis der Umwandlung undefiniert.
Der C-Standard legt in Abschnitt 5.2.9 ([expr.static.cast]) die Regel für das Downcasting fest using static_cast: „Wenn der Wert vom Typ ‚Zeiger auf cv1 B‘ auf ein B zeigt, das tatsächlich ein Unterobjekt eines Objekts vom Typ D ist, zeigt der resultierende Zeiger auf das umschließende Objekt Objekt vom Typ D. Andernfalls ist das Ergebnis der Umwandlung undefiniert undefiniert. Die Symptome von UB können sehr unterschiedlich sein und es gibt keine Garantie dafür, dass die abgeleitete Memberfunktion (func_d) erfolgreich aufgerufen werden kann.
Das obige ist der detaillierte Inhalt vonWann ist die Verwendung von „static_cast' für Downcasting in C undefiniertes Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!