Polymorphie in C++: Praktischer Leitfaden
Polymorphie = „viele Formen“. Tritt typischerweise bei Klassenhierarchien mit Vererbung auf.
C++-Polymorphie: Aufruf einer Memberfunktion führt je nach Objekttyp zu unterschiedlicher Funktionsausführung.
Beispiel ohne virtual (Statische Bindung)
#include <iostream>
using namespace std;
class Shape {
protected: int width, height;
public:
Shape(int a=0, int b=0) { width=a; height=b; }
int area() { cout << "Parent class area:" << endl; return 0; }
};
class Rectangle: public Shape {
public:
Rectangle(int a=0, int b=0):Shape(a,b) {}
int area() { cout << "Rectangle class area:" << endl; return width*height; }
};
class Triangle: public Shape {
public:
Triangle(int a=0, int b=0):Shape(a,b) {}
int area() { cout << "Triangle class area:" << endl; return width*height/2; }
};
int main() {
Shape* shape;
Rectangle rec(10,7);
Triangle tri(10,5);
shape = &rec; shape->area(); // Ruft Shape::area() auf!
shape = &tri; shape->area(); // Ruft Shape::area() auf!
return 0;
}
Ausgabe (falsch):
Parent class area:
Parent class area:
Ursache: Compiler bindet area() statisch (zur Compile-Zeit) an Shape::area() – Early Binding / Static Linkage.
Mit virtual (Dynamische Bindung)
virtual vor area() in Basisklasse:
class Shape {
// ...
virtual int area() { cout << "Parent class area:" << endl; return 0; }
};
Nun Ausgabe (korrekt):
Rectangle class area
Triangle class area
Compiler schaut auf Inhalt des Pointers (Objekttyp), nicht nur Pointer-Typ. Da Adressen von rec und tri in shape gespeichert sind, werden jeweilige area() aufgerufen.
Jede Kindklasse hat eigene area()-Implementierung – so wird Polymorphie genutzt.
Virtuelle Funktionen
virtual-Funktion in Basisklasse signalisiert: Keine statische Bindung erwünscht. Stattdessen Auswahl zur Laufzeit basierend auf Objekttyp – Dynamic Linkage / Late Binding.
Rein virtuelle Funktionen (Pure Virtual Functions)
Wenn Basisklasse keine sinnvolle Implementierung bieten kann, aber Interface vorschreiben will:
class Shape {
protected: int width, height;
public:
Shape(int a=0, int b=0) { width=a; height=b; }
virtual int area() = 0; // Pure virtual
};
= 0 bedeutet: Kein Body. Klasse wird abstrakt – nicht instanziierbar. Abgeleitete Klassen müssen implementieren.
C Sprache
- C++-Operatoren meistern: Ein vollständiger Leitfaden mit praktischen Beispielen
- Arrays an Funktionen in C++ übergeben: Ein praktischer Leitfaden
- C++ Klassen & Objekte: Praktischer Leitfaden zur objektorientierten Programmierung
- C++ Friend-Funktionen und Friend-Klassen: Zugriffskontrolle meistern
- C++ Klassentemplates meistern: Ein praktischer Leitfaden
- C++ Operator‑Overloading: Praktischer Leitfaden mit Code‑Beispielen
- C++ Speicherklassen: Scope, Lifetime & Verwendung
- C++ Overloading: Funktionen & Operatoren erklärt
- Datenabstraktion in C++: Interface-Implementierung-Trennung
- Datenkapselung in C++: Code schützen & strukturieren