Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erhalte ich in Konstruktoren und Destruktoren die Fehlermeldung „Rein virtueller Funktionsaufruf“?

Warum erhalte ich in Konstruktoren und Destruktoren die Fehlermeldung „Rein virtueller Funktionsaufruf“?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-15 07:12:02296Durchsuche

Why Do I Get

Schwerwiegende „Rein virtuelle Funktionsaufruf“-Fehler: Entschlüsselung ihrer Wurzeln

Es kann rätselhaft sein, bei der „rein virtuellen Funktion“ auf Programmabstürze zu stoßen Aufruffehler, insbesondere wenn die betroffene Klasse abstrakt ist und daher die Objekterstellung verhindern sollte. Ziel dieses Artikels ist es, Licht auf die zugrunde liegenden Ursachen solcher Fehler zu werfen und eine umfassende Erklärung zu liefern.

Virtuelle Funktionsaufrufe in abstrakten Klassen

Virtuelle Funktionen ermöglichen das Überschreiben abgeleiteter Klassen Basisklassenimplementierungen, die Polymorphismus ermöglichen. Allerdings haben in abstrakten Klassen bestimmte Funktionen, die als „rein virtuelle Funktionen“ bezeichnet werden, keine Implementierung in der Basisklasse. Stattdessen dienen sie als Platzhalter und erfordern, dass alle abgeleiteten Klassen ihre eigenen Implementierungen bereitstellen. Eine abstrakte Klasse ohne mindestens eine rein virtuelle Funktion kann instanziiert werden, aber Aufrufe rein virtueller Funktionen führen zu einem Laufzeitfehler.

„Rein virtueller Funktionsaufruf“ stürzt ab

Es kann jedoch ein unerwartetes Szenario auftreten, wenn versucht wird, eine virtuelle Funktion innerhalb eines Konstruktors oder Destruktors aufzurufen. Aufgrund der Einschränkungen bei der Objektkonstruktion und -zerstörung sind virtuelle Funktionsaufrufe in diesen Phasen nicht zulässig. Folglich wird stattdessen die Basisklassenversion der virtuellen Funktion aufgerufen, die im Fall einer rein virtuellen Funktion nicht vorhanden ist und einen Laufzeitabsturz auslöst.

Beispieldarstellung

Betrachten Sie den folgenden Codeausschnitt:

class Base
{
public:
    Base() { reallyDoIt(); }
    void reallyDoIt() { doIt(); } // DON'T DO THIS
    virtual void doIt() = 0;
};

class Derived : public Base
{
    void doIt() {}
};

int main(void)
{
    Derived d;  // This will cause "pure virtual function call" error
}

In diesem Beispiel führt ein Versuch, eine virtuelle Funktion (doIt()) vom Konstruktor der abstrakten Basisklasse (Base) aufzurufen, zu einer „rein virtuellen Funktion“. Fehler „Funktionsaufruf“, wenn das abgeleitete Klassenobjekt (d) erstellt wird. Da es in Base keine Implementierung für doIt() gibt, fällt der Aufruf auf den Platzhalter für reine virtuelle Funktionen durch, der ungültig ist.

Fazit

"Reine virtuelle Funktion „Call“-Fehler treten auf, wenn virtuelle Funktionsaufrufe versehentlich von Konstruktoren oder Destruktoren ausgeführt werden. Das Verständnis dieser Einschränkung ist entscheidend, um diese Abstürze zu vermeiden und die korrekte Funktion abstrakter Klassen sicherzustellen. Weitere Einblicke finden Sie in den aufschlussreichen Artikeln von Raymond Chen zu diesem Thema.

Das obige ist der detaillierte Inhalt vonWarum erhalte ich in Konstruktoren und Destruktoren die Fehlermeldung „Rein virtueller Funktionsaufruf“?. 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