C ++ polymorfizmus

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:

  1. Preťaženie funkcií
  2. Preťaženie obsluhy
  3. Prepísanie funkcie
  4. 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, doubleatď

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 Counttriedy (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 Basetriede a rovnakú funkciu v Derivedtriede

Keď voláme print()pomocou Derivedobjektu derivované1, prepíše print()funkciu Basevykonaním print()funkcie Derivedtriedy.

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.

Zaujímavé články...