C++
VeröffentlichtRevision 1

Vererbung, virtuelle Funktionen und Komposition

Vererbung bildet einen Typ auf der Grundlage eines anderen Typs. Der allgemeinere Typ heißt Basisklasse, der spezialisierte abgeleitete Klasse. Bei öffentlicher Vererbung sollte jedes abgeleitete Objekt sinnvoll als Objekt der Basisschnittstelle verwendbar sein.

Vererbung, virtuelle Funktionen und Komposition#

Eigene Datentypen und Klassen · Lektion 42 von 60

Voraussetzungen: Klassen, Smart Pointer. Lernziel: Du verwendest eine gemeinsame Schnittstelle, ohne Besitz- und Typregeln zu verlieren.

Vererbung bildet einen Typ auf der Grundlage eines anderen Typs. Der allgemeinere Typ heißt Basisklasse, der spezialisierte abgeleitete Klasse. Bei öffentlicher Vererbung sollte jedes abgeleitete Objekt sinnvoll als Objekt der Basisschnittstelle verwendbar sein.

C++
1#include <iostream>2#include <memory>3 4class Tier {5public:6    virtual ~Tier() = default;7    virtual void laut() const = 0;8};9 10class Hund : public Tier {11public:12    void laut() const override {13        std::cout << "Wuff\n";14    }15};16 17int main() {18    std::unique_ptr<Tier> tier = std::make_unique<Hund>();19    tier->laut();20}

virtual ermöglicht dynamische Bindung: Der Aufruf wählt zur Laufzeit die Umsetzung des tatsächlichen Objekttyps. Diese austauschbare Verwendung verschiedener konkreter Typen heißt Polymorphie. Die Ausgabe ist deshalb Wuff.

Abstrakte Schnittstellen#

= 0 kennzeichnet eine rein virtuelle Funktion. Die Basisklasse bleibt damit abstrakt und kann nicht selbst als vollständiges Tier-Objekt erzeugt werden. override verlangt vom Compiler, dass Hund::laut tatsächlich eine passende virtuelle Funktion überschreibt. Ein versehentlich anderes const oder ein falscher Parameter führt so zu einem nützlichen Fehler.

Der virtuelle Destruktor ist nötig für den hier vorgesehenen polymorphen Löschweg über den Basistyp. Ohne passenden virtuellen Destruktor wäre das Löschen des abgeleiteten Objekts über den Basisklassenzeiger fehlerhaft.

Slicing und übergroße Hierarchien#

Object Slicing bedeutet, dass beim Kopieren eines abgeleiteten Objekts in ein eigenständiges Basisobjekt nur der Basisteil übernommen wird. Für polymorphe Verwendung brauchst du geeignete Referenzen oder Zeiger, statt die unterschiedlichen Objekte auf Basiswerte zu reduzieren.

Komposition bedeutet, dass ein Objekt andere Objekte als Bestandteile enthält. Ein Auto „hat einen Motor“; es „ist kein Motor“. Solche Beziehungen sind oft besser als Member umgesetzt. Nutze Vererbung für austauschbare Schnittstellen und Komposition für zusammengesetzte Zuständigkeiten.

Übung#

Warum genügt es nicht, override zu entfernen, wenn der Compiler eine nicht passende Überschreibung meldet?

Lösung

Die Meldung deckt wahrscheinlich eine abweichende Signatur auf. Ohne override könnte unbemerkt eine andere Funktion entstehen, während die erwartete Basisschnittstelle weiterhin falsch oder unvollständig umgesetzt ist.

Weiterlernen#

Zurück: Konstruktoren, Destruktoren und Rule of Zero · Kursübersicht · Weiter: Templates, Typvorlagen und Concepts

Mitwirkende 1

Menschen, deren Änderungen in dieser Seite veröffentlicht wurden.

Kommentare 0

Kommentare sind für diese Seite deaktiviert.