Heim >Backend-Entwicklung >C++ >Warum scheint „static_cast' auf einen abgeleiteten Zeiger auf das gesamte abgeleitete Objekt in C zuzugreifen, wenn der ursprüngliche Zeiger auf ein Basisklassenobjekt zeigt?
In C bezieht sich Downcasting auf die Konvertierung eines Basisklassenzeigers oder einer Referenz auf einen abgeleiteten Klassenzeiger oder eine abgeleitete Referenz. Eine Möglichkeit, Downcasting durchzuführen, ist die Verwendung von static_cast<> Operator.
Betrachten Sie den folgenden Code:
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 Beispiel haben wir eine Basisklasse base und eine abgeleitete Klasse abgeleitet. Wir erstellen einen Basisklassenzeiger b, der auf ein Objekt vom Typ base zeigt. Mit static_cast<> versuchen wir, b in einen abgeleiteten Klassenzeiger d umzuwandeln.
Die verwirrende Frage hier ist, warum der abgeleitete Klassenzeiger d Zugriff auf das gesamte abgeleitete Klassenobjekt hat, obwohl b auf eine Basis zeigt Klassenobjekt.
Es ist jedoch wichtig zu verstehen, dass die Verwendung von static_cast<> Einen Zeiger auf einen Typ umzuwandeln, zu dem er nicht gehört, gilt in C als undefiniertes Verhalten.
Gemäß dem C-Standard ([expr.static.cast]) ein statisches Die Umwandlung von einem Basisklassenzeiger in einen abgeleiteten Klassenzeiger ist nur zulässig, wenn die folgenden Bedingungen erfüllt sind:
Wenn eine dieser Bedingungen nicht erfüllt ist, ist das Ergebnis der Umwandlung undefiniert.
Im angegebenen Code zeigt b auf ein reines Basisklassenobjekt ist kein umschließendes abgeleitetes Klassenobjekt, auf das verwiesen werden kann. Daher wird das Verhalten des Programms unvorhersehbar und man sollte sich nicht darauf verlassen.
Das obige ist der detaillierte Inhalt vonWarum scheint „static_cast' auf einen abgeleiteten Zeiger auf das gesamte abgeleitete Objekt in C zuzugreifen, wenn der ursprüngliche Zeiger auf ein Basisklassenobjekt zeigt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!