Heim > Backend-Entwicklung > C++ > Warum gibt der Aufruf einer virtuellen Funktion in einem Basisklassenkonstruktor den Basisklassenwert und nicht den abgeleiteten Klassenwert aus?

Warum gibt der Aufruf einer virtuellen Funktion in einem Basisklassenkonstruktor den Basisklassenwert und nicht den abgeleiteten Klassenwert aus?

Mary-Kate Olsen
Freigeben: 2024-12-21 05:24:10
Original
402 Leute haben es durchsucht

Why Does Calling a Virtual Function in a Base Class Constructor Print the Base Class Value, Not the Derived Class Value?

Konstruktoraufruf virtueller Funktionen

In C sind Konstruktoren für die Initialisierung von Objekten verantwortlich. Beim Umgang mit abgeleiteten Klassen und virtuellen Funktionen kann es jedoch zu spezifischem Verhalten kommen, das möglicherweise nicht sofort intuitiv ist.

Betrachten Sie das folgende Beispiel:

#include <iostream>

struct base {
   virtual const int value() const {
      return 0;
   }
   base() {
      std::cout << value() << std::endl;
   }
   virtual ~base() {}
};

struct derived : public base {
   virtual const int value() const {
      return 1;
   }
};

int main(void) {
   derived example;
}
Nach dem Login kopieren

In diesem Beispiel haben wir eine Basis Klassenbasis mit einem virtuellen Funktionswert(). Eine abgeleitete Klasse erbt von base und überschreibt value(). Der Konstruktor in „base“ versucht, value() innerhalb seines Konstruktors aufzurufen.

Wenn der Konstruktor von „derived“ aufgerufen wird, wird zuerst der Konstruktor von „base“ aufgerufen. Zu diesem Zeitpunkt befindet sich das Objekt noch im Status der Basisklasse und value() wird in die Implementierung der Basisklasse aufgelöst. Aus diesem Grund gibt das Programm „0“ anstelle der erwarteten „1“ aus.

Um dieses Problem zu beheben, müssen wir sicherstellen, dass das Objekt vollständig als abgeleitete Klasse initialisiert ist, bevor wir value() im Konstruktor aufrufen . Eine Möglichkeit, dies zu erreichen, besteht darin, den Aufruf von value() zu verzögern, bis der Konstruktor der abgeleiteten Klasse ausgeführt wurde. Dies kann durch die Verwendung einer virtuellen Funktion im abgeleiteten Klassenkonstruktor erfolgen.

Das obige ist der detaillierte Inhalt vonWarum gibt der Aufruf einer virtuellen Funktion in einem Basisklassenkonstruktor den Basisklassenwert und nicht den abgeleiteten Klassenwert aus?. 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