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
- Einfache und mehrfache Vererbung
- Virtuelle Funktionen und die vtable
- Abstrakte Klassen und rein virtuelle Methoden
- Vererbung vs. Komposition: Kompromisse