C++ Polymorphie erklärt: Praxisbeispiele & Kernkonzepte
Was ist Polymorphie in C++?
In C++ bewirkt Polymorphie, dass eine Member‑Funktion sich je nach dem Objekt, das sie aufruft, unterschiedlich verhält. Polymorphie ist ein griechisches Wort für „viele Formen“. Sie tritt auf, wenn Sie eine Hierarchie von Klassen haben, die durch Vererbung miteinander verbunden sind.
Beispiel: Angenommen, wir haben die Funktion makeSound(). Ruft eine Katze diese Funktion auf, ertönt ein Miauen. Ruft eine Kuh sie auf, ertönt ein Muh. Obwohl wir nur eine Funktion haben, verhält sie sich unter unterschiedlichen Umständen verschieden – die Funktion hat viele Formen; somit haben wir Polymorphie erreicht.

In diesem C++‑Tutorial lernen Sie:
- Was Polymorphie ist
- Arten der Polymorphie
- Compile‑Time Polymorphie
- Funktionen‑Overloading
- Operator‑Overloading
- Runtime‑Polymorphie
- Funktionen‑Overriding
- C++ Virtuelle Funktionen
- Compile‑Time vs. Run‑Time Polymorphie
Arten der Polymorphie
C++ unterstützt zwei Polymorphie‑Arten:
- Compile‑Time‑Polymorphie, und
- Runtime‑Polymorphie.

Compile‑Time‑Polymorphie
Sie rufen überladene Funktionen auf, indem Sie Anzahl und Typ der Argumente abgleichen. Diese Informationen liegen zur Compile‑Zeit vor, daher wählt der C++‑Compiler die passende Funktion bereits zur Compile‑Zeit aus.
Compile‑Time‑Polymorphie wird durch Funktionen‑Overloading und Operator‑Overloading erreicht.
Funktionen‑Overloading
Funktionen‑Overloading liegt vor, wenn mehrere Funktionen denselben Namen, aber unterschiedliche Parameter haben. Die Parameter können sich in Anzahl oder Typ unterscheiden.
Beispiel 1:
#include <iostream>
using namespace std;
void test(int i) {
cout << " Der int ist " << i << endl;
}
void test(double f) {
cout << " Der float ist " << f << endl;
}
void test(char const *ch) {
cout << " Der char* ist " << ch << endl;
}
int main() {
test(5);
test(5.5);
test("fünf");
return 0;
}
Ausgabe:

Screenshot des Codes:

Code‑Erklärung:
iostreamHeader einbinden.std‑Namespace nutzen.- Funktion
testmit Integer‑Parameterierstellen. - Anweisung, die ausgeführt wird, wenn obige
testaufgerufen wird. - Ende der ersten
test‑Funktion. - Zweite
test‑Funktion mit Float‑Parameterf. - Ausführbare Anweisung für zweite
test. - Ende der zweiten
test. - Dritte
test‑Funktion mitchar const*Parameter. - Ausführbare Anweisung für dritte
test. - Ende der dritten
test. main()aufrufen.test(5)aufrufen → erstetest(int).test(5.5)aufrufen → zweitetest(float).test("fünf")aufrufen → drittetest(char*).- Programm gibt bei Erfolg Wert zurück.
- Ende von
main().
Wir haben drei Funktionen mit demselben Namen, aber unterschiedlichen Argumenttypen – Polymorphie erreicht.
Operator‑Overloading
Beim Operator‑Overloading definieren Sie eine neue Bedeutung für einen C++‑Operator. Dies ändert auch die Funktionsweise des Operators. Beispiel: Den +‑Operator so definieren, dass er zwei Strings verkettet. Normalerweise ist er der Additionsoperator für Zahlen. Nach unserer Definition addiert er Integers, verkettet aber Strings.
Beispiel 2:
#include <iostream>
using namespace std;
class ComplexNum {
private:
int real, over;
public:
ComplexNum(int rl = 0, int ov = 0) {
real = rl;
over = ov;
}
ComplexNum operator + (ComplexNum const &obj) {
ComplexNum result;
result.real = real + obj.real;
result.over = over + obj.over;
return result;
}
void print() {
cout << real << " + i" << over << endl;
}
};
int main() {
ComplexNum c1(10, 2), c2(3, 7);
ComplexNum c3 = c1 + c2;
c3.print();
}
Ausgabe:

Screenshot des Codes:


Code‑Erklärung:
iostreamHeader einbinden.std‑Namespace nutzen.- Klasse
ComplexNumerstellen. privatefür Variablenreal,over.publicfür Konstruktor.- Konstruktor initialisiert Variablen.
realinitialisieren.overinitialisieren.- Konstruktor‑Ende.
+Operator überladen.- Ergebnis‑Objekt
resultvom TypComplexNum. - Realteile addieren.
- Imaginärteile addieren.
resultzurückgeben.- Ende der Overloading‑Definition.
print()Methode.- Neue komplexe Zahl nach Addition ausgeben.
- Ende von
print(). - Ende der Klasse
ComplexNum. main()aufrufen.- Werte für Real‑ und Imaginärteil übergeben (10+3, 2+7).
- Überladenen
+anwenden, Ergebnis inc3speichern. c3ausgeben.- Ende von
main().
Runtime‑Polymorphie
Dies geschieht, wenn eine Objekt‑Methode zur Laufzeit (nicht zur Compile‑Zeit) aufgerufen wird. Runtime‑Polymorphie wird durch Funktionen‑Overriding erreicht. Die aufzurufende Funktion wird zur Laufzeit festgelegt.
Funktionen‑Overriding
Funktionen‑Overriding tritt auf, wenn eine Basisklassen‑Funktion in einer abgeleiteten Klasse neu definiert wird. Dann sagen wir, die Basisfunktion wurde überschrieben.
Beispiel:
#include <iostream>
using namespace std;
class Mammal {
public:
void eat() { cout << "Mammals eat..."; }
};
class Cow : public Mammal {
public:
void eat() { cout << "Cows eat grass..."; }
};
int main(void) {
Cow c = Cow();
c.eat();
return 0;
}
Ausgabe:

Screenshot des Codes:

Code‑Erklärung:
iostreamHeader einbinden.std‑Namespace nutzen.- Klasse
Mammalerstellen. publicfür Funktioneat.- Funktion
eatdefinieren. - Ausgabe bei Aufruf von
eat(). - Ende von
eat(). - Ende der Klasse
Mammal. - Klasse
Cowableiten vonMammal. publicfür überschreibendeeat.- Basisfunktion
eat()überschreiben. - Ausgabe bei Aufruf der überschriebenen Funktion.
- Ende der überschriebenen
eat(). - Ende der Klasse
Cow. main()aufrufen.- Instanz
cvonCowerzeugen. eat()derCow‑Klasse aufrufen.- Programm gibt bei Erfolg Wert zurück.
- Ende von
main().
C++ Virtuelle Funktionen
Eine virtuelle Funktion ist ein weiterer Weg, Laufzeit‑Polymorphie in C++ zu implementieren. Es ist eine spezielle Funktion, die in einer Basisklasse definiert und in der abgeleiteten Klasse neu definiert wird. Zur Deklaration eines virtuellen Funktion verwenden Sie das Schlüsselwort virtual vor der Funktionsdeklaration in der Basisklasse.
Wird eine virtuelle Funktion vererbt, definiert die abgeleitete Klasse die virtuelle Funktion neu, um ihren Bedürfnissen gerecht zu werden. Beispiel:
#include <iostream>
using namespace std;
class ClassA {
public:
virtual void show() {
cout << "The show() function in base class invoked..." << endl;
}
};
class ClassB : public ClassA {
public:
void show() {
cout << "The show() function in derived class invoked...";
}
};
int main() {
ClassA* a;
ClassB b;
a = &b;
a->show();
}
Ausgabe:

Screenshot des Codes:

Code‑Erklärung:
iostreamHeader einbinden.std‑Namespace nutzen.- Klasse
ClassAerstellen. publicfür Member.- Virtuelle Funktion
show()definieren. - Text bei Aufruf von
show()in Basisklasse. - Ende von
show()in Basisklasse. - Ende der Klasse
ClassA. - Klasse
ClassBableiten vonClassA. publicfür Member.- Virtuelle Funktion
show()in abgeleiteter Klasse neu definieren. - Text bei Aufruf von
show()in abgeleiteter Klasse. - Ende von
show()in abgeleiteter Klasse. - Ende der Klasse
ClassB. main()aufrufen.- Zeiger
aaufClassA. - Instanz
bvonClassB. - Adresse von
binazuweisen. show()der abgeleiteten Klasse aufrufen – Late Binding realisiert.- Ende von
main().
Compile‑Time‑Polymorphie vs. Run‑Time‑Polymorphie
Wesentliche Unterschiede:
| Compile‑Time‑Polymorphie | Run‑Time‑Polymorphie |
|---|---|
| Auch Early Binding / Statische Polymorphie genannt | Auch Late / Dynamic Binding / Dynamische Polymorphie genannt |
| Methode wird zur Compile‑Zeit aufgerufen | Methode wird zur Laufzeit aufgerufen |
| Umgesetzt via Funktions‑Overloading & Operator‑Overloading | Umgesetzt via Methoden‑Overriding & Virtuelle Funktionen |
| Beispiel: Methoden‑Overloading – gleiche Namen, unterschiedliche Parameteranzahl/‑typen | Beispiel: Methoden‑Overriding – gleicher Name, gleicher Prototyp |
| Schnellere Ausführung (Methode zur Compile‑Zeit bekannt) | Langsamere Ausführung (Methode zur Laufzeit ermittelt) |
| Weniger Flexibilität (alles zur Compile‑Zeit bekannt) | Mehr Flexibilität für komplexe Probleme (Methoden zur Laufzeit entdeckt) |
Zusammenfassung:
- Polymorphie bedeutet „viele Formen“.
- Sie tritt auf, wenn eine Klassenhierarchie durch Vererbung verbunden ist.
- Mit Polymorphie kann eine Funktion sich je nach aufrufendem Objekt unterschiedlich verhalten.
- Bei Compile‑Time‑Polymorphie wird die aufzurufende Funktion zur Compile‑Zeit festgelegt.
- Bei Runtime‑Polymorphie wird die aufzurufende Funktion zur Laufzeit festgelegt.
- Compile‑Time‑Polymorphie durch Funktionen‑Overloading und Operator‑Overloading.
- Beim Funktionen‑Overloading gibt es viele Funktionen mit ähnlichem Namen, aber unterschiedlichen Argumenten (Anzahl/Typ).
- Beim Operator‑Overloading wird einem C++‑Operator eine neue Bedeutung gegeben.
- Runtime‑Polymorphie durch Funktionen‑Overriding erreicht.
- Beim Funktionen‑Overriding gibt eine abgeleitete Klasse einer Basisklassen‑Funktion eine neue Definition.
C Sprache
- Arrays an Funktionen in C++ übergeben: Ein praktischer Leitfaden
- C++ Operatoren erklärt: Typen, Beispiele und Beispielprogramme
- C++ switch‑case meistern: Syntax, Einsatz und Praxisbeispiele
- C++ Dynamische Array‑Allokation: Praktischer Leitfaden mit Code‑Beispielen
- C++ Operator‑Overloading: Praktischer Leitfaden mit Code‑Beispielen
- C++ Structs erklärt mit praktischem Beispiel
- std::list in C++ meistern: Syntax, Funktionen & praktische Beispiele
- C++-Funktionen erklärt: Mit praktischen Code-Beispielen
- C++ Struct vs. Class: Wichtige Unterschiede, Syntax und beste Anwendungsfälle
- calloc() in C: Null-initialisierte Speicherallokation mit praktischem Beispiel