C++ Funktionsüberschreibung erklärt – Praxisbeispiele & Best Practices
C++ Funktionsüberschreibung erklärt
Dieser Leitfaden entmystifiziert Funktionsüberschreibung in C++, mit klaren Beispielen, Best Practices und einer Schritt-für-Schritt-Anleitung, wie ein erfahrener C++-Entwickler sie in der Produktion einsetzen würde.
Warum Funktionsüberschreibung wichtig ist
In der objektorientierten Programmierung lässt Vererbung eine abgeleitete Klasse das Verhalten einer Basisklasse erweitern oder modifizieren. Wenn dieselbe Mitgliedsfunktion sowohl in der Basis- als auch in der abgeleiteten Klasse deklariert ist, „überschreibt“ die abgeleitete Implementierung die Basis-Version. Wenn Sie diese Funktion über ein abgeleitetes-Klassen-Objekt aufrufen, wird die überschriebene Version ausgeführt.
Beispiel 1: Grundlegende Überschreibung
#include <iostream> using namespace std; class Base { public: void print() { cout << "Basisfunktion" << endl; } }; class Derived : public Base { public: void print() { cout << "Abgeleitete Funktion" << endl; } }; int main() { Derived d; d.print(); return 0; }
Ausgabe
Abgeleitete Funktion
Der Aufruf von print() auf einer Derived-Instanz führt die überschriebene Funktion aus, nicht die Basis-Version.

Wenn Sie ein Base-Objekt erstellen und print() aufrufen, sehen Sie die ursprüngliche Basis-Implementierung.
Base b; b.print(); // Ausgabe: Basisfunktion
Auf die überschriebene Basisfunktion zugreifen
Manchmal müssen Sie die Basisklassen-Version explizit aufrufen. Zwei gängige Techniken sind:
- Verwendung des Gültigkeitsbereichsoperators
::. - Verwendung eines Basisklassen-Zeigers, der auf ein abgeleitetes Objekt zeigt (wenn die Funktion nicht virtual ist).
Beispiel 2: Gültigkeitsbereichsoperator zum Aufrufen der Basisfunktion
#include <iostream> using namespace std; class Base { public: void print() { cout << "Basisfunktion" << endl; } }; class Derived : public Base { public: void print() { cout << "Abgeleitete Funktion" << endl; } }; int main() { Derived d1, d2; d1.print(); d2.Base::print(); // Expliziter Aufruf von Base::print return 0; }
Ausgabe
Abgeleitete Funktion Basisfunktion
Beispiel 3: Basisfunktion aus der abgeleiteten Klasse aufrufen
#include <iostream> using namespace std; class Base { public: void print() { cout << "Basisfunktion" << endl; } }; class Derived : public Base { public: void print() { cout << "Abgeleitete Funktion" << endl; Base::print(); // Basis-Version aufrufen } }; int main() { Derived d; d.print(); return 0; }
Ausgabe
Abgeleitete Funktion Basisfunktion
Beispiel 4: Basisfunktion über Basisklassen-Zeiger zugreifen
#include <iostream> using namespace std; class Base { public: void print() { cout << "Basisfunktion" << endl; } }; class Derived : public Base { public: void print() { cout << "Abgeleitete Funktion" << endl; } }; int main() { Derived d; Base* ptr = &d; // Zeiger auf Base, der auf Derived-Objekt zeigt ptr->print(); // Ruft Base::print auf, da die Funktion nicht virtual ist return 0; }
Ausgabe
Basisfunktion
Wenn die Funktion nicht als virtual deklariert ist, ruft ein Basisklassen-Zeiger die Basis-Implementierung auf. Um echtes polymorphes Verhalten zu erreichen, deklarieren Sie die Basisfunktion als virtual und überschreiben Sie sie in der abgeleiteten Klasse.
Diese Beispiele veranschaulichen die Mechanik der Funktionsüberschreibung in C++. Durch die Beherrschung dieser Konzepte können Sie saubereren, wartbareren Code schreiben, der Polymorphie effektiv nutzt.
C Sprache
- C++-Operatoren meistern: Ein vollständiger Leitfaden mit praktischen Beispielen
- C++-Kommentare: Best Practices für lesbaren, wartbaren Code
- Arrays an Funktionen in C++ übergeben: Ein praktischer Leitfaden
- C++-Funktionen erklärt: Mit praktischen Code-Beispielen
- C-Funktionen meistern: Struktur, Deklaration & Best Practices
- C++ Programmiersprache: Überblick & Kernfeatures
- C++ Konstanten & Literale: Typen, Syntax & Best Practices
- C++ Operatoren: Typen, Nutzung & Best Practices
- C++ Numerische Typen: Praktischer Leitfaden
- C++ Overloading: Funktionen & Operatoren erklärt