In diesem Tutorial lernen wir anhand von Beispielen den Polymorphismus in C ++ kennen.
Polymorphismus ist ein wichtiges Konzept der objektorientierten Programmierung. Es bedeutet einfach mehr als eine Form. Das heißt, dieselbe Entität (Funktion oder Operator) verhält sich in verschiedenen Szenarien unterschiedlich. Beispielsweise,
Der +
Operator in C ++ wird verwendet, um zwei spezifische Funktionen auszuführen. Wenn es mit Zahlen (Ganzzahlen und Gleitkommazahlen) verwendet wird, führt es eine Addition durch.
int a = 5; int b = 6; int sum = a + b; // sum = 11
Und wenn wir den +
Operator mit Zeichenfolgen verwenden, führt er eine Zeichenfolgenverkettung durch. Beispielsweise,
string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;
Wir können Polymorphismus in C ++ auf folgende Arten implementieren:
- Funktionsüberladung
- Überlastung des Bedieners
- Funktionsüberschreibung
- Virtuelle Funktionen
Überladen von C ++ - Funktionen
In C ++ können wir zwei Funktionen mit demselben Namen verwenden, wenn sie unterschiedliche Parameter haben (entweder Typen oder Anzahl der Argumente).
Abhängig von der Anzahl / Art der Argumente werden verschiedene Funktionen aufgerufen. Beispielsweise,
// C++ program to overload sum() function #include using namespace std; // Function with 2 int parameters int sum(int num1, int num2) ( return num1 + num2; ) // Function with 2 double parameters double sum(double num1, double num2) ( return num1 + num2; ) // Function with 3 int parameters int sum(int num1, int num2, int num3) ( return num1 + num2 + num3; ) int main() ( // Call function with 2 int parameters cout << "Sum 1 = " << sum(5, 6) << endl; // Call function with 2 double parameters cout << "Sum 2 = " << sum(5.5, 6.6) << endl; // Call function with 3 int parameters cout << "Sum 3 = " << sum(5, 6, 7) << endl; return 0; )
Ausgabe
Summe 1 = 11 Summe 2 = 12,1 Summe 3 = 18
Hier haben wir 3 verschiedene sum()
Funktionen mit verschiedenen Parametern (Anzahl / Art der Parameter) erstellt. Und basierend auf den Argumenten, die während eines Funktionsaufrufs übergeben werden, wird eine bestimmte sum()
aufgerufen.
Dies ist ein Polymorphismus zur Kompilierungszeit, da der Compiler weiß, welche Funktion ausgeführt werden muss, bevor das Programm kompiliert wird.
Weitere Informationen finden Sie in unserem Tutorial zum Überladen von C ++ - Funktionen.
Überladen von C ++ - Operatoren
In C ++ können wir einen Operator überladen, solange wir mit benutzerdefinierten Typen wie Objekten oder Strukturen arbeiten.
Wir können nicht Operator für Grundtypen Überlastung verwenden wie int
, double
usw.
Operatorüberladung ist im Grunde eine Funktionsüberladung, bei der verschiedene Operatorfunktionen das gleiche Symbol, aber unterschiedliche Operanden haben.
Abhängig von den Operanden werden unterschiedliche Operatorfunktionen ausgeführt. Beispielsweise,
// C++ program to overload ++ when used as prefix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++() ( value = value + 1; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++()" function ++count1; count1.display(); return 0; )
Ausgabe
Anzahl: 6
Hier haben wir den ++
Operator überladen , der Objekte der Count
Klasse bearbeitet (in diesem Fall Objekt count1).
Wir haben diesen überladenen Operator verwendet, um die Wertvariable des count1-Objekts direkt um zu erhöhen 1
.
Dies ist auch ein Polymorphismus zur Kompilierungszeit .
Weitere Informationen finden Sie in unserem Tutorial zum Überladen von C ++ - Operatoren.
Überschreiben der C ++ - Funktion
Bei der C ++ - Vererbung können wir dieselbe Funktion sowohl in der Basisklasse als auch in den abgeleiteten Klassen haben.
Wenn wir die Funktion mit einem Objekt der abgeleiteten Klasse aufrufen, wird die Funktion der abgeleiteten Klasse anstelle der Funktion in der Basisklasse ausgeführt.
Je nach dem Objekt, das die Funktion aufruft, werden also unterschiedliche Funktionen ausgeführt.
Dies wird in C ++ als Überschreiben von Funktionen bezeichnet . Beispielsweise,
// C++ program to demonstrate function overriding #include using namespace std; class Base ( public: virtual void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function" << endl; ) ); int main() ( Derived derived1; // Call print() function of Derived class derived1.print(); return 0; )
Ausgabe
Abgeleitete Funktion
Hier haben wir eine print()
Funktion in der Base
Klasse und dieselbe Funktion in der Derived
Klasse verwendet
Wenn wir print()
das Derived
Objekt derivative1 aufrufen, überschreibt es die print()
Funktion von, Base
indem es die print()
Funktion der Derived
Klasse ausführt .
Es handelt sich um einen Laufzeitpolymorphismus, da der Funktionsaufruf nicht vom Compiler aufgelöst wird, sondern stattdessen zur Laufzeit.
Weitere Informationen finden Sie in unserem Tutorial zum Überschreiben von C ++ - Funktionen.
Virtuelle C ++ - Funktionen
In C ++ können wir Funktionen möglicherweise nicht überschreiben, wenn wir einen Zeiger der Basisklasse verwenden, um auf ein Objekt der abgeleiteten Klasse zu verweisen.
Durch die Verwendung virtueller Funktionen in der Basisklasse wird sichergestellt, dass die Funktion in diesen Fällen überschrieben werden kann.
Somit fallen virtuelle Funktionen tatsächlich unter das Überschreiben von Funktionen . Beispielsweise,
// C++ program to demonstrate the use of virtual functions #include using namespace std; class Base ( public: virtual void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function"
Output
Derived Function
Here, we have used a virtual function
print()
in the Base
class to ensure that it is overridden by the function in the Derived
class.
Virtual functions are runtime polymorphism.
To learn more, visit our C++ Virtual Functions tutorial.
Why Polymorphism?
Polymorphism allows us to create consistent code. For example,
Suppose we need to calculate the area of a circle and a square. To do so, we can create a
Shape
class and derive two classes Circle
and Square
from it.
In this case, it makes sense to create a function having the same name
calculateArea()
in both the derived classes rather than creating functions with different names, thus making our code more consistent.