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; }
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!