Kursinhalt
C++ OOP
C++ OOP
Reine Virtuelle Methode
Das Konzept der virtuellen Methoden ist entscheidend für die Umsetzung von Polymorphie und ermöglicht ein flexibles sowie erweiterbares Softwaredesign. Rein virtuelle Methoden erweitern dies, indem sie Schnittstellen definieren und die dynamische Bindung unterstützen.
Syntax einer rein virtuellen Methode
Eine rein virtuelle Methode wird mit dem Schlüsselwort virtual
deklariert und mit null initialisiert. Dies zeigt an, dass die Funktion innerhalb der class
keine Definition besitzt und von jeder Unterklasse überschrieben werden muss, bevor Objekte dieser class
instanziiert werden können.
virtual.h
virtual void example() = 0;
Diese Methode funktioniert ähnlich wie eine gewöhnliche Methode, außer dass sie keinen Rumpf in { }
besitzt und stattdessen mit = 0;
abgeschlossen wird, was auf eine fehlende Implementierung hinweist. Die übrigen Regeln für diese Methode entsprechen jedoch denen regulärer Methoden.
Die Deklaration einer rein virtuellen Methode macht die class
, in der sie deklariert ist, abstrakt, was bedeutet, dass es unmöglich ist, Objekte dieser Klasse zu instanziieren. Diese Einschränkung besteht, weil jede Methode innerhalb der class
implementiert werden muss, bevor eine Instanz erstellt und verwendet werden kann, um Fehler und unvorhersehbares Verhalten zu vermeiden. Siehe dir den folgenden Code an:
Animal.h
class Animal { public: virtual void speak() = 0; };
Die Animal
-class
verfügt über eine reine virtuelle Methode namens speak()
, wodurch die Instanziierung von Objekten dieser Klasse verhindert wird. Dieses Design ist sinnvoll, da der Zweck der virtuellen Methode darin besteht, die charakteristischen Laute jedes Tieres darzustellen.
Durch die Deklaration der Methode als virtuell kann jede Unterklasse ihre eigene Version implementieren, um die Individualität des Tierlauts einzufangen. Die Deklaration als reine virtuelle Methode zeigt an, dass keine Standardimplementierung existiert, und betont die Notwendigkeit konkreter Implementierungen in abgeleiteten Klassen.
main.cpp
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }
Auch dies ist nachvollziehbar. Die Erstellung von Instanzen der Animal
-class
wäre unpraktisch und widersinnig, da sie ein abstraktes Konzept repräsentiert, das als Kategorie für verschiedene Tiere dient. Es gibt kein spezifisches Verhalten, das mit einem generischen Tier verbunden ist, was die abstrakte Natur der class
unterstreicht und die Bedeutung der Erstellung spezialisierter Unterklassen hervorhebt, um die einzigartigen Laute jedes einzelnen Tieres abzubilden.
main.cpp
#include <iostream> class Animal { public: // Pure virtual function to enforce implementation in derived classes virtual void speak() = 0; }; class Cat : public Animal { public: void speak() override { std::cout << "Meow!" << std::endl; } }; class Dog : public Animal { public: void speak() override { std::cout << "Bark!" << std::endl; } }; class Cow : public Animal { public: void speak() override { std::cout << "Moo!" << std::endl; } }; void pet(Animal& animal) { animal.speak(); } int main() { // Replace `Cat` with `Dog` or `Cow` to see their specific behavior Cat cat; pet(cat); }
Obwohl es nicht möglich ist, ein Objekt vom Typ Animal
direkt zu erstellen, kann dieser dennoch als Parameter in einer Funktion verwendet werden. Ähnlich wie im vorherigen Button-Beispiel nutzt dieser Ansatz Polymorphie, um ein vielseitiges Programm zu gestalten, das sein Verhalten zur Laufzeit dynamisch ändern kann.
Versuchen Sie, ein Objekt einer anderen class
an die Funktion zu übergeben und beobachten Sie die Ausgabe. Versuchen Sie außerdem, ein Objekt der abstrakten class
zu erstellen, um zu sehen, wie der Compiler die Instanziierung aufgrund nicht implementierter reiner virtueller Methoden verhindert.
Danke für Ihr Feedback!