În acest tutorial, vom învăța despre polimorfism în C ++ cu ajutorul unor exemple.
Polimorfismul este un concept important de programare orientată pe obiecte. Înseamnă pur și simplu mai multe forme. Adică, aceeași entitate (funcție sau operator) se comportă diferit în scenarii diferite. De exemplu,
+
Operatorul în C ++ este folosit pentru a realiza două funcții specifice. Când este utilizat cu numere (numere întregi și cu virgulă mobilă), se efectuează adunarea.
int a = 5; int b = 6; int sum = a + b; // sum = 11
Și când folosim +
operatorul cu șiruri, acesta efectuează concatenarea șirurilor. De exemplu,
string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;
Putem implementa polimorfismul în C ++ folosind următoarele moduri:
- Supraîncărcarea funcției
- Suprasolicitarea operatorului
- Anularea funcției
- Funcții virtuale
Supraîncărcarea funcției C ++
În C ++, putem folosi două funcții cu același nume dacă au parametri diferiți (fie tipuri, fie număr de argumente).
Și, în funcție de numărul / tipul de argumente, sunt apelate diferite funcții. De exemplu,
// 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; )
Ieșire
Suma 1 = 11 Suma 2 = 12,1 Suma 3 = 18
Aici, am creat 3 sum()
funcții diferite cu parametri diferiți (număr / tip de parametri). Și, pe baza argumentelor transmise în timpul unui apel de funcție, sum()
se numește un anumit .
Este un polimorfism de compilare, deoarece compilatorul știe ce funcție trebuie executată înainte de compilarea programului.
Pentru a afla mai multe despre acestea, vizitați tutorialul nostru de supraîncărcare a funcției C ++.
Supraîncărcarea operatorului C ++
În C ++, putem supraîncărca un operator atâta timp cât operăm pe tipuri definite de utilizator, cum ar fi obiecte sau structuri.
Nu putem folosi supraîncărcarea operatorului pentru tipuri de bază , cum ar fi int
, double
etc.
Supraîncărcarea operatorului este practic supraîncărcarea funcției, în care funcțiile operatorului diferit au același simbol, dar operanzi diferiți.
Și, în funcție de operanzi, sunt executate diferite funcții de operator. De exemplu,
// 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; )
Ieșire
Număr: 6
Aici, am supraîncărcat ++
operatorul, care operează pe obiecte de Count
clasă (număr de obiecte1 în acest caz).
Am folosit acest operator suprasolicitat pentru a crește direct variabila de valoare a obiectului count1 cu 1
.
Acesta este, de asemenea, un polimorfism de compilare .
Pentru a afla mai multe, vizitați tutorialul nostru de supraîncărcare a operatorului C ++.
Anularea funcției C ++
În moștenirea C ++, putem avea aceeași funcție în clasa de bază, precum și clasele derivate ale acesteia.
Când apelăm funcția folosind un obiect al clasei derivate, funcția clasei derivate este executată în locul celei din clasa de bază.
Deci, diferite funcții sunt executate în funcție de obiectul care apelează funcția.
Acest lucru este cunoscut sub numele de funcție suprascriere în C ++. De exemplu,
// 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; )
Ieșire
Funcție derivată
Aici, am folosit o print()
funcție în Base
clasă și aceeași funcție în Derived
clasă
Când apelăm print()
folosind Derived
obiectul derivat1, acesta suprascrie print()
funcția Base
de executând print()
funcția Derived
clasei.
Este un polimorfism de execuție, deoarece apelul funcției nu este rezolvat de compilator, dar este rezolvat în timp de execuție.
Pentru a afla mai multe, vizitați tutorialul nostru C ++ Function Overriding.
Funcții virtuale C ++
În C ++, este posibil să nu putem înlocui funcțiile dacă folosim un pointer din clasa de bază pentru a indica un obiect din clasa derivată.
Utilizarea funcțiilor virtuale în clasa de bază asigură că funcția poate fi anulată în aceste cazuri.
Astfel, funcțiile virtuale intră de fapt sub suprascrierea funcției . De exemplu,
// 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.