Heim >Backend-Entwicklung >C++ >Warum verhalten sich virtuelle Funktionen während der C-Objektinitialisierung unerwartet?

Warum verhalten sich virtuelle Funktionen während der C-Objektinitialisierung unerwartet?

Linda Hamilton
Linda HamiltonOriginal
2024-12-11 13:22:16747Durchsuche

Why Do Virtual Functions Behave Unexpectedly During C   Object Initialization?

Vererbung und Objektinitialisierung in C für den Zugriff auf virtuelle Funktionen verstehen

In C ermöglicht die Vererbung die Erstellung abgeleiteter Klassen, die Eigenschaften und Verhaltensweisen erben aus Basisklassen. Die Initialisierungsreihenfolge von Objekten in C kann sich jedoch auf das Verhalten virtueller Funktionen auswirken.

Frage:

Wenn ein Objekt in C mit einer Basisklasse erstellt wird, die eine virtuelle Funktion hat Funktion, warum verhält sich diese Funktion möglicherweise unerwartet?

Antwort:

Der Schlüssel Konzept ist hier die Reihenfolge der Initialisierung für Basis- und abgeleitete Klassen. In C werden Basisklassen vor abgeleiteten Klassen erstellt.

Erklärung:

Im bereitgestellten Beispiel:

  • Die Basisklasse definiert a virtuelle Funktion value(), die standardmäßig 0 zurückgibt.
  • abgeleitet erbt von der Basis und überschreibt die zurückzugebende Funktion value() 1.
  • Wenn die Ableitung instanziiert wird, wird zunächst der Basisteil des Objekts erstellt.
  • Zu diesem Zeitpunkt ist das Objekt jedoch noch keine vollständige abgeleitete Instanz, wie der Konstruktor der abgeleiteten Klasse wurde noch nicht ausgeführt.
  • Wenn der Basiskonstruktor daher value() aufruft, ruft er die Basisversion der Funktion auf und nicht die überschriebene abgeleitete Version, was zur Folge hat in einer Ausgabe von 0.

Um dieses Verhalten zu beheben:

Um sicherzustellen, dass die value()-Funktion der abgeleiteten Klasse während der Objektkonstruktion aufgerufen wird, sollten Sie Folgendes tun Initialisieren Sie die Basisklasse explizit mit der Adresse der abgeleiteten Klasseninstanz:

derived example;
base(&example).value()

Indem Sie die Adresse des abgeleiteten Objekts übergeben, weisen Sie den Basiskonstruktor dazu an Rufen Sie die Funktion value() für das abgeleitete Objekt auf und „reifen“ Sie das Objekt effektiv in seine vollständige abgeleitete Form.

Das obige ist der detaillierte Inhalt vonWarum verhalten sich virtuelle Funktionen während der C-Objektinitialisierung unerwartet?. 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