V tomto tutoriáli sa pomocou príkladov dozvieme o polymorfizme v C ++.
Polymorfizmus je dôležitý koncept objektovo orientovaného programovania. Znamená to jednoducho viac ako jednu formu. To znamená, že rovnaká entita (funkcia alebo operátor) sa v rôznych scenároch správa odlišne. Napríklad,
+
Operátor v C ++ slúži na vykonávanie dve špecifické funkcie. Ak sa používa s číslami (celé čísla a čísla s pohyblivou rádovou čiarkou), vykoná sčítanie.
int a = 5; int b = 6; int sum = a + b; // sum = 11
A keď použijeme +
operátor s reťazcami, vykoná zreťazenie reťazca. Napríklad,
string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;
Polymorfizmus v C ++ môžeme implementovať nasledujúcimi spôsobmi:
- Preťaženie funkcií
- Preťaženie obsluhy
- Prepísanie funkcie
- Virtuálne funkcie
Preťaženie funkcií v C ++
V C ++ môžeme použiť dve funkcie s rovnakým názvom, ak majú odlišné parametre (typy alebo počet argumentov).
A v závislosti od počtu / typu argumentov sa volajú rôzne funkcie. Napríklad,
// 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; )
Výkon
Súčet 1 = 11 Súčet 2 = 12,1 Súčet 3 = 18
Tu sme vytvorili 3 rôzne sum()
funkcie s rôznymi parametrami (počet / typ parametrov). A na základe argumentov odovzdaných počas volania funkcie sa volá konkrétny sum()
.
Je to polymorfizmus v čase kompilácie, pretože kompilátor vie, ktorú funkciu má vykonať, skôr ako sa program skompiluje.
Ak sa chcete dozvedieť viac, navštívte náš tutoriál preťaženia funkcií C ++.
Preťaženie operátora C ++
V C ++ môžeme operátora preťažiť, pokiaľ pracujeme na používateľom definovaných typoch, ako sú objekty alebo štruktúry.
Nemôžeme použiť operátor preťaženie základných typov ako int
, double
atď
Preťaženie operátora je v podstate preťaženie funkcie, keď rôzne operátorské funkcie majú rovnaký symbol, ale rôzne operandy.
A v závislosti od operandov sa vykonávajú rôzne operátorské funkcie. Napríklad,
// 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; )
Výkon
Počet: 6
Tu sme preťažili ++
operátor, ktorý pracuje s objektmi Count
triedy (v tomto prípade objekt count1).
Tento preťažený operátor sme použili na priame zvýšenie hodnotovej premennej objektu count1 o 1
.
Toto je tiež polymorfizmus v čase kompilácie .
Ak sa chcete dozvedieť viac, navštívte náš návod na preťaženie operátora C ++.
Prepísanie funkcie C ++
V dedičnosti C ++ môžeme mať rovnakú funkciu v základnej triede aj v jej odvodených triedach.
Keď funkciu zavoláme pomocou objektu odvodenej triedy, vykoná sa namiesto odvodenej v základnej triede funkcia odvodenej triedy.
Vykonávajú sa teda rôzne funkcie v závislosti od objektu, ktorý funkciu volá.
Toto sa v C ++ označuje ako prepísanie funkcie . Napríklad,
// 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; )
Výkon
Odvodená funkcia
Tu sme použili print()
funkciu v Base
triede a rovnakú funkciu v Derived
triede
Keď voláme print()
pomocou Derived
objektu derivované1, prepíše print()
funkciu Base
vykonaním print()
funkcie Derived
triedy.
Je to runtime polymorfizmus, pretože volanie funkcie nie je kompilátorom vyriešené, ale je vyriešené namiesto neho v runtime.
Ak sa chcete dozvedieť viac, navštívte náš výukový program Prepisovanie funkcií C ++.
Virtuálne funkcie v C ++
V C ++ nemusíme byť schopní prepísať funkcie, ak na ukážku na objekt odvodenej triedy použijeme ukazovateľ základnej triedy.
Používanie virtuálnych funkcií v základnej triede zaisťuje, že v týchto prípadoch je možné funkciu prepísať.
Tak, virtuálne funkcie v skutočnosti spadajú do funkcie najazdenia vozidiel . Napríklad,
// 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.