0Pricing
C++ Academy · Lektion

Virtuelle Funktionen und die vtable

Implementieren Sie Laufzeitpolymorphie mit virtuellen Funktionen und untersuchen Sie das Konzept der vtable.

Virtuelle Funktionen und die vtable ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Statische oder dynamische Bindung

Memberaufrufe werden standardmäßig statisch gebunden – der Compiler wählt die Funktion anhand des deklarierten Typs aus. Bei virtual-Funktionen wird der Aufruf anhand des tatsächlichen Typs dynamisch gebunden.

Eine virtuelle Funktion deklarieren

Kennzeichnen Sie die Funktion in der Basisklasse mit virtual. Abgeleitete Klassen können sie überschreiben.

class Shape {
public:
    virtual double area() const = 0;        // pure virtual
    virtual ~Shape() = default;
};

class Circle : public Shape {
    double r_;
public:
    Circle(double r) : r_(r) {}
    double area() const override { return 3.14159 * r_ * r_; }
};

Der Spezifizierer override

Fügen Sie abgeleiteten Methoden override hinzu. Der Compiler überprüft, ob die Funktion tatsächlich eine virtuelle Funktion überschreibt, und erkennt Tippfehler in der Signatur.

Der Spezifizierer final

final verhindert weiteres Überschreiben. Verwenden Sie ihn bei Klassen, von denen nicht geerbt werden soll, oder bei Methoden, die nicht erneut überschrieben werden sollen.

class Concrete final : public Base { /* ... */ };
class Base {
    virtual void f() final;   // cannot be overridden
};

Aufruf über einen Zeiger auf die Basisklasse

Das ist die Magie des Polymorphismus: Ein Zeiger auf die Basisklasse kann die richtige Methode der abgeleiteten Klasse aufrufen.

Shape* s = new Circle(3.0);
std::cout << s->area();   // 28.27... (Circle::area)
delete s;

Das vtable-Konzept

Jede polymorphe Klasse besitzt eine verborgene vtable – eine Tabelle mit Funktionszeigern. Jedes Objekt enthält einen verborgenen Zeiger (vptr) auf die vtable seiner Klasse.

Kosten virtueller Aufrufe

Ein virtueller Aufruf enthält eine zusätzliche Indirektion über die vtable. In den meisten Programmen ist das vernachlässigbar. Vermeiden Sie virtuelle Aufrufe in inneren Schleifen, wenn Messungen zeigen, dass sie zum Engpass werden.

Rein virtuelle Funktionen

Fügen Sie = 0 an, um eine Funktion als rein virtuell zu deklarieren. Abgeleitete Klassen müssen sie überschreiben, damit sie instanziierbar sind. Die Klasse wird abstrakt.

Virtuelle Destruktoren

Wenn eine Klasse eine virtuelle Funktion besitzt oder über einen Zeiger auf die Basisklasse gelöscht werden soll, geben Sie ihr einen virtuellen Destruktor. Andernfalls wird der Destruktor der abgeleiteten Klasse nie ausgeführt.

class Base {
public:
    virtual ~Base() = default;   // safe to delete through Base*
};

Polymorphismus mit Smart Pointern

Halten Sie polymorphe Objekte über Smart Pointer auf die Basisklasse. Der Smart Pointer übernimmt die korrekte Zerstörung.

std::unique_ptr<Shape> s = std::make_unique<Circle>(3.0);

Slicing erneut betrachtet

Wenn Sie ein Objekt der abgeleiteten Klasse per Wert an eine Funktion übergeben, die die Basisklasse erwartet, wird der Teil der abgeleiteten Klasse abgeschnitten. Verwenden Sie für polymorphe Parameter Referenzen oder Zeiger.

Abwägung bei der Performance

Virtuelle Funktionen bieten Flexibilität zu geringen Laufzeitkosten. Templates ermöglichen Polymorphismus zur Compile-Zeit ohne Laufzeitkosten – entscheiden Sie danach, ob Polymorphismus zur Laufzeit benötigt wird.

Kurzer Test

Warum sollte eine polymorphe Basisklasse einen virtual-Destruktor haben?

Zusammenfassung

Virtuelle Funktionen ermöglichen Laufzeitpolymorphismus über eine klassenbezogene vtable. Kennzeichnen Sie Überschreibungen mit override und verhindern Sie weitere Vererbung mit final. Geben Sie polymorphen Basisklassen immer einen virtuellen Destruktor.

Häufig gestellte Fragen

Ist die Lektion „Virtuelle Funktionen und die vtable“ kostenlos?

Ja — der vollständige Text von „Virtuelle Funktionen und die vtable“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Virtuelle Funktionen und die vtable“?

Implementieren Sie Laufzeitpolymorphie mit virtuellen Funktionen und untersuchen Sie das Konzept der vtable. Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C++ Academy zu starten?

Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Virtuelle Funktionen und die vtable“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?

Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Einfache und mehrfache Vererbung
  2. Virtuelle Funktionen und die vtable
  3. Abstrakte Klassen und rein virtuelle Methoden
  4. Vererbung vs. Komposition: Kompromisse
← Zurück zu C++ Academy