Kursinhalt
C++ OOP
C++ OOP
Reine Virtuelle Methode
Das Konzept der virtuellen Methode ist ein Grundpfeiler für die Erreichung von Polymorphismus, einem grundlegenden Prinzip beim Entwerfen flexibler und erweiterbarer Softwaresysteme. Reine virtuelle Methoden stellen eine mächtige Erweiterung dieses Konzepts dar, indem sie einen Mechanismus zur Definition von Schnittstellen bieten und dynamisches Binden ermöglichen.
Syntax der reinen virtuellen Methode
Eine reine virtuelle Methode wird mit dem Schlüsselwort virtual deklariert und auf null initialisiert. Dies zeigt an, dass die Funktion innerhalb der Klasse keine Definition hat und von jeder Unterklasse überschrieben werden muss, bevor Objekte dieser Klasse instanziiert werden können.
Hinweis
Diese Methode funktioniert ähnlich wie eine Standardmethode, außer dass sie keinen Körper in
{ }
hat und stattdessen mit= 0;
endet, was auf keine Implementierung hinweist. Dennoch gelten die anderen Regeln für diese Methode genauso wie für die anderen.
Die Deklaration einer reinen virtuellen Methode macht die Klasse, in der sie deklariert ist, abstrakt. Das bedeutet, dass es unmöglich wird, Objekte davon zu instanziieren. Diese Einschränkung entsteht, weil jede Methode innerhalb der Klasse implementiert werden muss, bevor eine Instanz erstellt und genutzt werden kann, um Fehler und unvorhersehbares Verhalten zu verhindern. Schauen Sie sich den folgenden Code an:
Animal
class Animal { public: virtual void speak() = 0; };
Die Animal Klasse verfügt über eine reine virtuelle Methode namens speak(), die die Instanziierung von Objekten aus dieser Klasse verhindert. Diese Designentscheidung ist logisch, da der Zweck der virtuellen Methode darin besteht, die charakteristischen Geräusche jedes Tieres darzustellen.
Durch die virtuelle Methode kann jede Unterklasse ihre eigene Version implementieren, um die Individualität der Geräusche jedes Tieres einzufangen. Die Entscheidung, die Methode rein virtuell zu machen, zeigt an, dass keine Standardimplementierung existiert, und betont die Notwendigkeit konkreter Implementierungen in abgeleiteten Klassen.
main
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }
Das macht auch Sinn. Instanzen der Animal Klasse zu erstellen, wäre unpraktisch und kontraintuitiv, da sie ein abstraktes Konzept darstellt, 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 Klasse verstärkt und die Bedeutung der Erstellung spezialisierter Unterklassen hervorhebt, um die Nuancen der Geräusche jedes spezifischen Tieres einzufangen.
main
#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, können wir es dennoch als Parameter in einer Funktion verwenden. Ähnlich wie im Beispiel mit den zuvor erwähnten Buttons nutzen wir Polymorphismus, um ein vielseitiges Programm zu erstellen, das sein Verhalten zur Laufzeit dynamisch ändern kann.
Hinweis
Versuchen Sie, ein Objekt einer anderen Klasse an die Funktion zu übergeben und überprüfen Sie die Ausgabe. Versuchen Sie außerdem, ein Objekt einer abstrakten Klasse zu erstellen und schauen Sie sich die Ergebnisse an.
Danke für Ihr Feedback!