Š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:
- Funkcijos perkrova
- Operatoriaus perkrova
- Funkcijos svarbesnė
- 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
, double
ir 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 Count
klasė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ą Base
klasėje ir tą pačią funkciją Derived
klasėje
Kai mes skambiname print()
naudodami Derived
išvestinį objektą1, jis , atlikdamas klasės funkciją, nepaiso print()
funkcijos .Base
print()
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.