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?

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?

DDD
DDDOriginal
2024-11-26 15:20:10305Durchsuche

Why Does `static_cast` to a Derived Pointer Seem to Access the Entire Derived Object in C   When the Original Pointer Points to a Base Class Object?

Downcasting mit Static Cast in C

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:

  1. Es existiert eine gültige Standardkonvertierung von „Zeiger zu“. D“ zu „Zeiger auf B“ (wobei D die abgeleitete Klasse und B die Basisklasse ist).
  2. B ist keine virtuelle Basisklasse von D oder eine Basisklasse einer virtuellen Basisklasse von D.
  3. Wenn das Basisklassenobjekt, auf das gezeigt wird, tatsächlich ein Unterobjekt eines abgeleiteten Klassenobjekts ist, sollte der resultierende Zeiger auf die umschließende abgeleitete Klasse zeigen Objekt.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn