Direkt zum Hauptinhalt springen
eLearner.app
Modul 6 · Lektion 2 von 214/18 im Kurs~15 min
Lektionen des Moduls (2/2)

Polymorphie und virtuelle Funktionen

Polymorphismus (Vielgestaltigkeit) ermöglicht es, Objekte verschiedener abgeleiteter Klassen über einen Zeiger oder eine Referenz auf ihre Basisklasse zu behandeln. Dies stellt sicher, dass zur Laufzeit die richtige Version der jeweiligen Methode ausgeführt wird (Late Binding).

Virtuelle Funktionen: virtual und override

Um Polymorphismus für eine Methode zu aktivieren, müssen wir sie in der Basisklasse mit dem Schlüsselwort virtual deklarieren. In abgeleiteten Klassen verwenden wir den Spezifikator override, um explizit anzugeben, dass wir diese Methode überschreiben.

Code
class Employee {
public:
    virtual void work() {
        std::cout << "Lavoro generico" << std::endl;
    }
    // WICHTIG: Virtueller Destruktor in der Basisklasse zur Vermeidung von Speicherlecks
    virtual ~Employee() = default;
};

class Developer : public Employee {
public:
    void work() override {
        std::cout << "Scrittura codice in C++" << std::endl;
    }
};

Wenn Sie Zeiger auf die Basisklasse verwenden, löst C++ die richtige Methode zur Laufzeit auf:

Code
Employee* emp = new Developer();
emp->work(); // Stampa "Scrittura codice in C++" invece di "Lavoro generico"
delete emp;

Abstrakte Klassen und rein virtuelle Funktionen

Eine rein virtuelle Funktion (pure virtual function) ist eine virtuelle Elementfunktion, die am Ende mit = 0 deklariert wird. Sie stellt einen formalen Vertrag dar: Die Basisklasse stellt keine Implementierung bereit, sondern delegiert diese vollständig an die Unterklassen.

Eine Klasse, die mindestens eine rein virtuelle Funktion enthält, wird als abstrakte Klasse bezeichnet und kann nicht direkt instanziiert werden.

Code
class Instrument {
public:
    virtual void play() = 0; // Virtuale pura
    virtual ~Instrument() = default;
};

class Piano : public Instrument {
public:
    void play() override {
        std::cout << "Suono del pianoforte..." << std::endl;
    }
};

Probier es aus

Übung#cpp.m6.l2.e1
Versuche: 0Wird geladen…

Definiere eine virtuelle Methode makeSound() in Animal, die 'Some sound' ausgibt. Überschreibe sie anschließend in der Klasse Cat unter Verwendung des Spezifikators override, um 'Meow' auszugeben.

Editor wird geladen…
Hinweis anzeigen

Denke daran, der Methode der Basisklasse `virtual` voranzustellen und `override` nach den runden Klammern der Parameter in der abgeleiteten Klasse zu platzieren.

Lösung nach 3 Versuchen verfügbar

Übung#cpp.m6.l2.e2
Versuche: 0Wird geladen…

Deklariere eine rein virtuelle Funktion print() mit dem Rückgabetyp void innerhalb der abstrakten Klasse Printable. Erstelle dann die Klasse Document, die öffentlich von Printable erbt, und implementiere die Methode print() so, dass 'Printing Document' ausgegeben wird.

Editor wird geladen…
Hinweis anzeigen

Eine rein virtuelle Funktion wird mit der Signatur `virtual void print() = 0;` deklariert. Stelle sicher, dass `Document` öffentlich von `Printable` erbt.

Lösung nach 3 Versuchen verfügbar