Warum virtuelle Funktionen nicht von Konstruktoren aufgerufen werden können
In C spielen virtuelle Funktionen eine entscheidende Rolle bei der Polymorphie, indem sie abgeleitete Objekte ermöglichen Klassen, um von ihren Basisklassen geerbte Methoden zu überschreiben. Es kommt jedoch zu einem häufigen Missverständnis, wenn versucht wird, virtuelle Funktionen innerhalb von Klassenkonstruktoren aufzurufen.
Betrachten Sie den folgenden Beispielcode:
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; }
Wenn dieser Code ausgeführt wird, gibt er statt „0“ aus die erwartete „1“. Warum?
Der Grund liegt in der Reihenfolge der Konstruktorausführung. Wenn ein abgeleitetes Klassenobjekt erstellt wird, wird zuerst der Basisklassenkonstruktor aufgerufen. Zu diesem Zeitpunkt ist das abgeleitete Klassenobjekt noch nicht vollständig konstruiert und seine virtuellen Methoden können nicht zuverlässig aufgerufen werden.
Wenn der Basisklassenkonstruktor value() aufruft, greift er auf die Basisklassenimplementierung der virtuellen Funktion zu, weil Die abgeleitete Klasse ist noch nicht zu einem abgeleiteten Objekt „gereift“. Um sicherzustellen, dass virtuelle Funktionen korrekt aufgerufen werden, muss auf sie aus vollständig konstruierten Objekten zugegriffen werden.
Um den Code zu korrigieren und „1“ auszugeben, muss daher der Methodenaufruf value() im Basisklassenkonstruktor erfolgen entfernt oder verschoben werden, bis das Objekt vollständig fertiggestellt ist.
Das obige ist der detaillierte Inhalt vonWarum geben in einem Konstruktor aufgerufene virtuelle Funktionen die Basisklassenimplementierung zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!