Heim > Backend-Entwicklung > C++ > Warum geben in einem Konstruktor aufgerufene virtuelle Funktionen die Basisklassenimplementierung zurück?

Warum geben in einem Konstruktor aufgerufene virtuelle Funktionen die Basisklassenimplementierung zurück?

Mary-Kate Olsen
Freigeben: 2024-12-10 11:48:34
Original
388 Leute haben es durchsucht

Why Do Virtual Functions Called in a Constructor Return the Base Class Implementation?

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;
}
Nach dem Login kopieren

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!

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