Sobes.tech
Junior — Middle

Was ist die Spezifik des Aufrufs virtueller Methoden innerhalb des Konstruktors einer Klasse?

sobes.tech KI

Antwort von AI

Beim Aufruf virtueller Methoden innerhalb des Konstruktors einer Klasse in C++ tritt eine Besonderheit auf: Virtuelle Aufrufe funktionieren nicht wie üblich. Während der Ausführung des Konstruktors zeigt die virtuelle Tabelle (vtable) auf die Methoden der aktuellen Klasse und nicht auf die in den abgeleiteten Klassen überschriebenen.

Das bedeutet, dass wenn innerhalb des Konstruktors der Basisklasse eine virtuelle Methode aufgerufen wird, genau die Methode der Basisklasse aufgerufen wird, auch wenn sie in der abgeleiteten Klasse überschrieben wurde. Dies wurde gemacht, um Aufrufe von Methoden zu vermeiden, die von noch nicht initialisierten Teilen des Objekts abhängen könnten.

Beispiel:

class Base {
public:
    Base() { foo(); }
    virtual void foo() { std::cout << "Base::foo" << std::endl; }
};

class Derived : public Base {
public:
    Derived() : Base() {}
    void foo() override { std::cout << "Derived::foo" << std::endl; }
};

int main() {
    Derived d; // Gibt "Base::foo" aus, nicht "Derived::foo"
}

Daher erfolgt der Aufruf virtueller Methoden in Konstruktoren und Destruktoren immer im Kontext der aktuellen Klasse, nicht der abgeleiteten.