Heim >Backend-Entwicklung >C++ >Wie kann „static_cast' scheinbar den Zugriff auf die Mitglieder einer abgeleiteten Klasse ermöglichen, wenn ein Basiszeiger auf ein bestimmtes Basisobjekt heruntergestuft wird?

Wie kann „static_cast' scheinbar den Zugriff auf die Mitglieder einer abgeleiteten Klasse ermöglichen, wenn ein Basiszeiger auf ein bestimmtes Basisobjekt heruntergestuft wird?

Linda Hamilton
Linda HamiltonOriginal
2024-11-30 10:35:11306Durchsuche

How Can `static_cast` Seemingly Allow Access to a Derived Class's Members When Downcasting a Base Pointer to a Distinct Base Object?

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:

  • Wenn der Basiszeiger zeigt auf ein Basisobjekt, das ein Unterobjekt eines abgeleiteten Objekts ist, dann zeigt der resultierende abgeleitete Zeiger auf das umschließende abgeleitete Objekt.
  • Andernfalls ist das Ergebnis der Umwandlung undefiniert.

In unserem Beispiel:

  • Der Basiszeiger zeigt auf ein Basisobjekt, das sich von allen anderen unterscheidet abgeleitetes Objekt.
  • Daher führt der Downcast auf „derived*“ zu undefiniertem Verhalten.

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!

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