Heim > Backend-Entwicklung > C++ > Wie unterscheidet sich „dynamic_cast' von C von „static_cast' bei der Laufzeittypprüfung?

Wie unterscheidet sich „dynamic_cast' von C von „static_cast' bei der Laufzeittypprüfung?

Susan Sarandon
Freigeben: 2024-12-01 15:29:15
Original
425 Leute haben es durchsucht

How Does C  's `dynamic_cast` Differ from `static_cast` in Runtime Type Checking?

Dynamic_cast in C verstehen

dynamic_cast ermöglicht, wie der Name schon sagt, die Laufzeittypprüfung für Zeiger- und Referenzkonvertierungen in C. Im Gegensatz zu static_cast, das die Konvertierung zur Kompilierzeit durchführt, führt Dynamic_cast die Überprüfung zur Ausführungszeit durch.

Um das Konzept von Dynamic_cast in C zu verstehen, vergleichen wir es mit der Sprache C.

static_cast

static_cast<Type*>(ptr);
Nach dem Login kopieren

Dies führt zur Kompilierungszeit eine Typkonvertierung von ptr in Type* durch. Es wird jedoch davon ausgegangen, dass die Typen verwandt sind und dass sie kompatibel sein müssen. Wenn die Konvertierung ungültig ist, kann das Programm nicht kompiliert werden.

dynamic_cast

dynamic_cast<Type*>(ptr);
Nach dem Login kopieren

Ähnlich wie static_cast versucht Dynamic_cast, den Zeiger ptr in Type* zu konvertieren. . Diese Konvertierung erfolgt jedoch zur Laufzeit. Dies ermöglicht mehr Flexibilität, insbesondere beim Umgang mit Vererbung und Polymorphismus.

Im bereitgestellten Beispiel:

  • dynamic_cast(ap) konvertiert ap erfolgreich in ein B* weil B von A abgeleitet ist.
  • dynamic_cast(ap) und Dynamic_cast(b) funktioniert auch korrekt.
  • dynamic_cast(ap) gibt NULL zurück, da C nicht von A abgeleitet ist.
  • Für Referenzen: Dynamic_cast(&*ap) sind beide erfolgreich, while Dynamic_cast(&*ap) löst eine std::bad_cast-Ausnahme aus.

Regeln für Dynamic_cast:

  • Basis- to-derived (B2D) Casts: Diese Casts geben immer einen gültigen Zeiger zurück, wenn der Zeiger auf zeigt ein Objekt des angegebenen Typs. Wenn der Zeiger nicht auf ein Objekt des richtigen Typs zeigt, wird ein NULL-Zeiger zurückgegeben.
  • Derived-to-Base (D2B)-Umwandlungen: Diese Umwandlungen sind immer erfolgreich und geben a zurück gültiger Zeiger. Die Ausnahme tritt auf, wenn versucht wird, einen leeren Zeiger auf einen abgeleiteten Typ umzuwandeln, was zu einem NULL-Zeiger führt.

Bedenken Sie, dass für die Umwandlung von der Basis in einen abgeleiteten Typ die beteiligten Klassen polymorph sein müssen. Das bedeutet, dass in ihrer Basisklasse mindestens eine virtuelle Funktion deklariert sein muss.

Das obige ist der detaillierte Inhalt vonWie unterscheidet sich „dynamic_cast' von C von „static_cast' bei der Laufzeittypprüfung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage