C ++ polimorfizmas

Šioje pamokoje pavyzdžių pagalba sužinosime apie C ++ polimorfizmą.

Polimorfizmas yra svarbi objektinio programavimo samprata. Tai tiesiog reiškia daugiau nei vieną formą. Tai yra, tas pats subjektas (funkcija ar operatorius) skirtinguose scenarijuose elgiasi skirtingai. Pavyzdžiui,

+C ++ operatorius naudojamas atlikti dvi konkrečias funkcijas. Kai jis naudojamas su skaičiais (sveikaisiais ir slankiojo kablelio skaičiais), jis atlieka papildymą.

 int a = 5; int b = 6; int sum = a + b; // sum = 11

Kai mes naudojame +operatorių su eilutėmis, jis atlieka stygų sujungimą. Pavyzdžiui,

 string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;

C ++ polimorfizmą galime įgyvendinti šiais būdais:

  1. Funkcijos perkrova
  2. Operatoriaus perkrova
  3. Funkcijos svarbesnė
  4. Virtualios funkcijos

C ++ Funkcijos perkrova

C ++ versijoje galime naudoti dvi funkcijas, turinčias tą patį pavadinimą, jei jos turi skirtingus parametrus (tipų arba argumentų skaičių).

Atsižvelgiant į argumentų skaičių / tipą, iškviečiamos skirtingos funkcijos. Pavyzdžiui,

 // 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; )

Rezultatas

 1 suma = 11 suma 2 = 12,1 3 suma = 18

Čia mes sukūrėme 3 skirtingas sum()funkcijas su skirtingais parametrais (parametrų skaičius / tipas). Remiantis argumentais, perduotais per funkcijos iškvietimą, iškviečiamas konkretus sum().

Tai kompiliavimo laiko polimorfizmas, nes kompiliatorius žino, kurią funkciją atlikti prieš sudarant programą.

Norėdami sužinoti daugiau apie tai, apsilankykite mūsų C ++ funkcijų perkėlimo pamokoje.

C ++ operatoriaus perkrova

C ++ versijoje galime perkrauti operatorių tol, kol dirbame su vartotojo apibrėžtais tipais, tokiais kaip objektai ar struktūros.

Mes negalime naudoti operatorių perkrovos pagrindinių tipų, kaip antai int, doubleir tt

Operatoriaus perkrova iš esmės yra funkcijų perkrova, kai skirtingos operatoriaus funkcijos turi tą patį simbolį, bet skirtingus operandus.

Ir, priklausomai nuo operandų, vykdomos skirtingos operatoriaus funkcijos. Pavyzdžiui,

 // 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; )

Rezultatas

 Skaičius: 6

Čia mes perkrauname ++operatorių, kuris veikia Countklasės objektus (šiuo atveju objektų skaičius1).

Mes naudojome šį perkrautą operatorių, kad tiesiogiai padidintume count1 objekto vertės kintamąjį 1.

Tai taip pat yra kompiliavimo laiko polimorfizmas .

Norėdami sužinoti daugiau, apsilankykite mūsų C ++ operatoriaus perkrovimo pamokoje.

C ++ Funkcijos svarbesnė

C ++ paveldėjime mes galime atlikti tą pačią funkciją pagrindinėje klasėje, taip pat išvestines iš jos klases.

Kai funkciją iškviečiame naudodami išvestinės klasės objektą, vykdoma išvestinės klasės funkcija, o ne ta, kuri yra pagrindinėje klasėje.

Taigi, skirtingos funkcijos vykdomos priklausomai nuo objekto iškvietimo objekto.

Tai vadinama funkcija, viršijančia C ++. Pavyzdžiui,

 // 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; )

Rezultatas

 Išvestinė funkcija

Čia mes naudojome print()funkciją Baseklasėje ir tą pačią funkciją Derivedklasėje

Kai mes skambiname print()naudodami Derivedišvestinį objektą1, jis , atlikdamas klasės funkciją, nepaiso print()funkcijos .Baseprint()Derived

Tai yra vykdymo laiko polimorfizmas, nes funkcijos iškvietimas nėra išspręstas kompiliatoriuje, tačiau jis išspręstas vykdymo metu.

Norėdami sužinoti daugiau, apsilankykite mūsų C ++ funkcijų nepaisymo pamokoje.

C ++ virtualios funkcijos

Naudojant C ++, mes negalime nepaisyti funkcijų, jei naudosime bazinės klasės žymeklį, kad nurodytume išvestinės klasės objektą.

Naudojant virtualių funkcijų bazine klasės užtikrina , kad funkcija gali būti nepaisoma tokiais atvejais.

Taigi virtualioms funkcijoms iš tikrųjų netaikomos funkcijos . Pavyzdžiui,

 // 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.

Įdomios straipsniai...