Sobes.tech
Junior — Middle

Welche Folgen können auftreten, wenn eine virtuelle Funktion im Destruktor eines Objekts aufgerufen wird?

sobes.tech KI

Antwort von AI

Beim Aufruf einer virtuellen Funktion innerhalb des Destruktors eines Objekts in C++ wird die Version der Funktion aufgerufen, die dem aktuellen Typ des Objekts im Zerstörungsprozess entspricht, und nicht die der abgeleiteten Klasse. Dies liegt daran, dass während der Ausführung des Destruktors das Objekt bereits auf die Basisklasse "verringert" wurde, und der Mechanismus der virtuellen Aufrufe berücksichtigt keine abgeleiteten Klassen.

Folgen:

  • Wenn die virtuelle Funktion in der abgeleiteten Klasse überschrieben wurde, ruft der Aufruf im Destruktor der Basisklasse nicht diese überschrieben Version auf, sondern die Basisklassen-Version.
  • Dies kann zu unerwartetem Verhalten oder Fehlern führen, wenn die Funktion vom Zustand der abgeleiteten Klasse abhängt, der bereits zerstört wurde.

Beispiel:

#include <iostream>

struct Base {
    virtual ~Base() {
        foo(); // Aufruf einer virtuellen Funktion
    }
    virtual void foo() { std::cout << "Base::foo" << std::endl; }
};

struct Derived : Base {
    ~Derived() override {
        std::cout << "Derived Destruktor" << std::endl;
    }
    void foo() override { std::cout << "Derived::foo" << std::endl; }
};

int main() {
    Base* obj = new Derived();
    delete obj; // ruft Base::~Base(), innerhalb dessen foo() Base::foo aufruft
}

Ausgabe:

Derived Destruktor
Base::foo

Daher ruft der virtuelle Funktionsaufruf im Destruktor nicht die Überschreibung der abgeleiteten Klasse auf.