V tej vadnici bomo s pomočjo primerov spoznali polimorfizem v jeziku C ++.
Polimorfizem je pomemben koncept objektno usmerjenega programiranja. Preprosto pomeni več oblik. To pomeni, da se ista entiteta (funkcija ali operater) v različnih scenarijih obnaša različno. Na primer
+
Operater v C ++ se uporablja za opravljanje dveh posebnih funkcij. Ko se uporablja s števili (cela števila in števila s plavajočo vejico), izvede seštevanje.
int a = 5; int b = 6; int sum = a + b; // sum = 11
In ko uporabimo +
operator z nizi, izvede združevanje nizov. Na primer
string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;
Polimorfizem v jeziku C ++ lahko izvedemo na naslednje načine:
- Preobremenitev funkcije
- Preobremenitev operaterja
- Preglasitev funkcije
- Navidezne funkcije
Preobremenitev funkcije C ++
V C ++ lahko uporabimo dve funkciji z istim imenom, če imata različne parametre (bodisi vrste bodisi število argumentov).
In glede na število / vrsto argumentov se pokličejo različne funkcije. Na primer
// 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; )
Izhod
Vsota 1 = 11 Vsota 2 = 12,1 Vsota 3 = 18
Tu smo ustvarili 3 različne sum()
funkcije z različnimi parametri (število / vrsta parametrov). Na podlagi argumentov, posredovanih med klicem funkcije, se pokliče določena sum()
.
Gre za polimorfizem časa prevajanja, ker prevajalnik ve, katero funkcijo naj izvede, preden je program preveden.
Če želite izvedeti več o tem, obiščite našo vadnico za preobremenitve funkcij C ++.
Preobremenitev operaterja C ++
V C ++ lahko operaterja preobremenimo, če delujemo na uporabniško določenih tipih, kot so predmeti ali strukture.
Ne moremo uporabiti operaterja preobremenitve za osnovne tipe, kot so int
, double
itd
Preobremenitev operaterja je v bistvu preobremenitev funkcij, kjer imajo različne funkcije operaterja enak simbol, vendar različne operande.
In glede na operande se izvajajo različne funkcije operaterja. Na primer
// 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; )
Izhod
Štetje: 6
Tu smo preobremenili ++
operator, ki deluje na objektih Count
razreda (v tem primeru objekt count1).
Ta preobremenjeni operater smo uporabili za neposredno povečanje spremenljivke vrednosti predmeta count1 za 1
.
To je tudi polimorfizem v času prevajanja .
Če želite izvedeti več, obiščite našo vadnico za preobremenitev operaterja C ++.
Preglasitev funkcije C ++
Pri dedovanju C ++ imamo lahko enako funkcijo v osnovnem razredu kot tudi njegovi izpeljani razredi.
Ko funkcijo pokličemo z uporabo predmeta izpeljanega razreda, se izvede funkcija izpeljanega razreda namesto tiste v osnovnem razredu.
Izvajajo se torej različne funkcije, odvisno od predmeta, ki funkcijo pokliče.
To je znano kot preglasitev funkcije v C ++. Na primer
// 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; )
Izhod
Izpeljana funkcija
Tu smo uporabili print()
funkcijo v Base
razredu in isto funkcijo v Derived
razredu
Ko pokličemo print()
z uporabo Derived
predmeta izvedeno1, preglasi print()
funkcijo z Base
tako, da izvrši print()
funkcijo Derived
razreda.
Gre za polimorfizem izvajalnega okolja, ker prevajalnik ne razreši klica funkcije, ampak je razrešen v času izvajanja.
Če želite izvedeti več, obiščite našo vadnico za preglasitev funkcij C ++.
Navidezne funkcije C ++
V C ++ morda ne bomo mogli preglasiti funkcij, če s kazalcem osnovnega razreda pokažemo na objekt izpeljanega razreda.
Uporaba navideznih funkcij v osnovnem razredu zagotavlja, da je funkcijo v teh primerih mogoče preglasiti.
Tako navidezne funkcije dejansko spadajo pod preglasitev funkcij . Na primer
// 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.