Abstrakte Klassen und rein virtuelle Methoden
Definieren Sie Schnittstellen mit rein virtuellen Methoden und setzen Sie Verträge für abgeleitete Klassen durch.
Abstrakte Klassen und rein virtuelle Methoden ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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.
Was ist eine abstrakte Klasse?
Eine abstrakte Klasse besitzt mindestens eine rein virtuelle Funktion, die mit = 0 deklariert wird. Sie können sie nicht direkt instanziieren.
class Animal {
public:
virtual void speak() const = 0; // pure virtual
virtual ~Animal() = default;
};
// Animal a; // ERROR: cannot instantiateRein virtuelle Funktionen
= 0 kennzeichnet eine Funktion als Funktion ohne Standardimplementierung. Abgeleitete Klassen müssen sie überschreiben, bevor die Klasse instanziiert werden kann.
Die Schnittstelle implementieren
Abgeleitete Klassen stellen konkrete Implementierungen für jede rein virtuelle Funktion bereit.
class Dog : public Animal {
public:
void speak() const override {
std::cout << "Woof!\n";
}
};
Dog d;
d.speak(); // Woof!Abstrakte Klassen als Schnittstellen
Eine abstrakte Klasse, die nur rein virtuelle Methoden und keine Datenmember besitzt, fungiert wie eine Schnittstelle in anderen Sprachen.
class Drawable {
public:
virtual void draw() const = 0;
virtual ~Drawable() = default;
};Implementierung und Schnittstelle kombinieren
Abstrakte Klassen können sowohl rein virtuelle als auch konkrete Methoden enthalten. Rein virtuelle Methoden definieren den Vertrag; konkrete Methoden stellen gemeinsames Verhalten bereit.
class Logger {
public:
void logInfo(const std::string& msg) { log("INFO", msg); }
void logError(const std::string& msg) { log("ERROR", msg); }
protected:
virtual void log(const std::string& level, const std::string& msg) = 0;
};Rein virtuelle Funktion mit Standardimplementierung
Eine rein virtuelle Funktion kann einen Funktionskörper besitzen – nützlich als Standardimplementierung, die abgeleitete Klassen aufrufen können.
class Base {
public:
virtual void f() = 0;
};
void Base::f() {
std::cout << "default behavior\n";
}
class Derived : public Base {
public:
void f() override {
Base::f(); // call the default
std::cout << "extra\n";
}
};Über Zeiger und Referenzen verwenden
Polymorpher Code hält abstrakte Objekte über Zeiger oder Referenzen auf den Basistyp.
void perform(const Animal& a) {
a.speak();
}In Containern speichern
Vektoren können abstrakte Typen nicht als Werte aufnehmen. Verwenden Sie Zeiger, typischerweise Smart Pointer.
std::vector<std::unique_ptr<Animal>> zoo;
zoo.push_back(std::make_unique<Dog>());
zoo.push_back(std::make_unique<Cat>());
for (auto& a : zoo) a->speak();Wann Sie abstrakte Klassen verwenden sollten
Verwenden Sie sie, wenn:
- Sie eine gemeinsame Schnittstelle für mehrere voneinander unabhängige Implementierungen definieren möchten
- Sie einen Basistyp für polymorphe Container benötigen
- Sie Verhalten über Unterklassen einschleusen möchten (Template-Method-Muster)
Alternativen: Concepts und Templates
Für Polymorphismus zur Compile-Zeit ersetzen C++20-Concepts und Templates abstrakte Klassen häufig – ohne Laufzeitkosten. Verwenden Sie virtual, wenn Polymorphismus zur Laufzeit benötigt wird.
Stolperfalle: Slicing
Übergeben Sie abstrakte Klassen per Referenz oder Zeiger. Eine Übergabe per Wert ist ohnehin unmöglich, da ein abstrakter Typ nicht instanziiert werden kann – bei einer Übergabe abgeleiteter Klassen per Wert würde jedoch Slicing auftreten.
Kurzer Test
Was macht eine Klasse in C++ abstrakt?
Zusammenfassung
Abstrakte Klassen – also Klassen mit mindestens einer rein virtuellen Methode – definieren Schnittstellen für polymorphen Code. Verwenden Sie sie mit Zeigern oder Referenzen, häufig Smart Pointern, um Verhalten zur Laufzeit zu verteilen.
Lerne C++ mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 51
- Lektionen
- 203
Häufig gestellte Fragen
Ist die Lektion „Abstrakte Klassen und rein virtuelle Methoden“ kostenlos?
Ja — der vollständige Text von „Abstrakte Klassen und rein virtuelle Methoden“ 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 „Abstrakte Klassen und rein virtuelle Methoden“?
Definieren Sie Schnittstellen mit rein virtuellen Methoden und setzen Sie Verträge für abgeleitete Klassen durch. 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 3 von 4.
Wie lange dauert die Lektion „Abstrakte Klassen und rein virtuelle Methoden“?
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