Šajā apmācībā mēs ar piemēriem uzzināsim par polimorfismu C ++.
Polimorfisms ir svarīgs objektorientētas programmēšanas jēdziens. Tas vienkārši nozīmē vairāk nekā vienu formu. Tas ir, viena un tā pati vienība (funkcija vai operators) dažādos scenārijos rīkojas atšķirīgi. Piemēram,
+
C ++ operators tiek izmantots, lai veiktu divas konkrētas funkcijas. Ja to lieto kopā ar skaitļiem (veseliem skaitļiem un peldošā komata skaitļiem), tas veic saskaitīšanu.
int a = 5; int b = 6; int sum = a + b; // sum = 11
Un, kad mēs izmantojam +
operatoru ar virknēm, tas veic virkņu savienošanu. Piemēram,
string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;
Mēs varam ieviest polimorfismu C ++, izmantojot šādus veidus:
- Funkciju pārslodze
- Operatora pārslodze
- Funkcijas prioritāte
- Virtuālās funkcijas
C ++ Funkcijas pārslodze
Programmā C ++ mēs varam izmantot divas funkcijas ar vienādu nosaukumu, ja tām ir atšķirīgi parametri (vai nu veidi, vai argumentu skaits).
Atkarībā no argumentu skaita / veida tiek izsauktas dažādas funkcijas. Piemēram,
// 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; )
Rezultāts
Summa 1 = 11 Summa 2 = 12,1 Summa 3 = 18
Šeit mēs esam izveidojuši 3 dažādas sum()
funkcijas ar dažādiem parametriem (parametru skaits / tips). Un, pamatojoties uz argumentiem, kas nodoti funkcijas izsaukuma laikā, sum()
tiek izsaukts konkrētais .
Tas ir kompilēšanas laika polimorfisms, jo kompilators zina, kuru funkciju izpildīt pirms programmas sastādīšanas.
Lai uzzinātu vairāk par to, apmeklējiet mūsu C ++ funkciju pārslodzes apmācību.
C ++ Operatora pārslodze
Programmā C ++ mēs varam pārslogot operatoru, ja vien mēs darbojamies ar lietotāja definētiem tipiem, piemēram, objektiem vai struktūrām.
Mēs nevaram izmantot operatoru nepārslogotu pamata veidi, piemēram, int
, double
uc
Operatora pārslodze būtībā ir funkciju pārslodze, kur dažādām operatora funkcijām ir vienāds simbols, bet atšķirīgi operandi.
Un, atkarībā no operandiem, tiek izpildītas dažādas operatora funkcijas. Piemēram,
// 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; )
Rezultāts
Skaits: 6
Šeit mēs esam pārslogojuši ++
operatoru, kurš darbojas ar Count
klases objektiem (šajā gadījumā objektu skaits1).
Mēs esam izmantojuši šo pārslogoto operatoru, lai tieši palielinātu objekta count1 vērtības mainīgo 1
.
Tas ir arī kompilācijas laika polimorfisms .
Lai uzzinātu vairāk, apmeklējiet mūsu C ++ Operator pārslodzes apmācību.
C ++ Funkcijas ignorēšana
C ++ mantojumā mums var būt tāda pati funkcija kā bāzes klasē, tā arī no tās atvasinātajām klasēm.
Kad mēs izsaucam funkciju, izmantojot atvasinātas klases objektu, tiek izpildīta atvasinātās klases funkcija, nevis tā, kas atrodas bāzes klasē.
Tātad dažādas funkcijas tiek izpildītas atkarībā no objekta, kas izsauc šo funkciju.
To sauc par funkcijas ignorēšanu C ++. Piemēram,
// 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; )
Rezultāts
Atvasinātā funkcija
Šeit mēs izmantojām print()
funkciju Base
klasē un to pašu funkciju Derived
klasē
Kad mēs izsaucam, print()
izmantojot Derived
atvasināto objektu1, tas ignorē print()
funkciju, Base
izpildot klases print()
funkciju Derived
.
Tas ir izpildlaika polimorfisms, jo funkciju izsaukumu kompilators neatrisina, bet tas tiek atrisināts izpildlaika vietā.
Lai uzzinātu vairāk, apmeklējiet mūsu C ++ funkciju ignorēšanas apmācību.
C ++ virtuālās funkcijas
Programmā C ++ mēs, iespējams, nevarēsim ignorēt funkcijas, ja izmantojam bāzes klases rādītāju, lai norādītu uz atvasinātās klases objektu.
Izmantojot virtuālo funkciju bāzes klases , nodrošina , ka funkcijas var ignorēt šajos gadījumos.
Tādējādi virtuālās funkcijas faktiski tiek pakļautas funkciju ignorēšanai . Piemēram,
// 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.