U ovom uputstvu naučit ćemo o polimorfizmu u C ++ uz pomoć primjera.
Polimorfizam je važan koncept objektno orijentiranog programiranja. To jednostavno znači više oblika. Odnosno, isti se entitet (funkcija ili operator) ponaša različito u različitim scenarijima. Na primjer,
+
Operater u C ++ se koristi za obavljanje dvije specifične funkcije. Kada se koristi s brojevima (cijeli brojevi i brojevi s pomičnom zarezom), izvodi zbrajanje.
int a = 5; int b = 6; int sum = a + b; // sum = 11
A kada koristimo +
operator sa nizovima, on izvodi spajanje nizova. Na primjer,
string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;
Polimorfizam u C ++ možemo implementirati na sljedeće načine:
- Preopterećenje funkcije
- Preopterećenje operatera
- Nadjačavanje funkcije
- Virtualne funkcije
Preopterećenje funkcije C ++
U C ++-u možemo koristiti dvije funkcije s istim imenom ako imaju različite parametre (bilo vrste ili broj argumenata).
I, ovisno o broju / vrsti argumenata, pozivaju se različite funkcije. Na primjer,
// 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; )
Izlaz
Zbroj 1 = 11 Zbir 2 = 12,1 Zbir 3 = 18
Ovdje smo stvorili 3 različite sum()
funkcije s različitim parametrima (broj / vrsta parametara). I, na temelju argumenata proslijeđenih tijekom poziva funkcije, poziva se određeno sum()
.
To je polimorfizam vremena kompajliranja, jer kompajler zna koju funkciju treba izvršiti prije nego što se program kompajlira.
Da biste saznali više, posjetite naš vodič za preopterećenje funkcija C ++.
Preopterećenje operatora C ++
U C ++-u možemo preopteretiti operatora sve dok radimo na korisnički definiranim vrstama poput objekata ili struktura.
Ne možemo upotrijebiti operator preopterećenja za osnovne vrste, kao što su int
, double
itd
Preopterećenje operatora u osnovi je preopterećenje funkcije, gdje različite funkcije operatora imaju isti simbol, ali različite operande.
I, ovisno o operandima, izvršavaju se različite funkcije operatora. Na primjer,
// 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; )
Izlaz
Broj: 6
Ovdje smo preopteretili ++
operator koji djeluje na objektima Count
klase (u ovom slučaju objekt count1).
Koristili smo ovaj preopterećeni operator za izravno uvećanje varijable vrijednosti count1 objekta za 1
.
Ovo je također polimorfizam vremena prevođenja .
Da biste saznali više, posjetite naš vodič za preopterećenje operatora C ++.
Nadjačavanje funkcije C ++
U nasljeđivanju C ++ možemo imati istu funkciju u osnovnoj klasi kao i njezine izvedene klase.
Kada funkciju pozivamo pomoću objekta izvedene klase, izvršava se funkcija izvedene klase umjesto one u osnovnoj klasi.
Dakle, izvršavaju se različite funkcije ovisno o objektu koji poziva funkciju.
To je poznato kao nadjačavanje funkcije u C ++-u. Na primjer,
// 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; )
Izlaz
Izvedena funkcija
Ovdje smo koristili print()
funkciju u Base
klasi i istu funkciju u Derived
klasi
Kada zovemo print()
pomoću Derived
objekta izvedenog1, on nadjačava print()
funkciju Base
izvršavanjem print()
funkcije Derived
klase.
Riječ je o polimorfizmu izvođenja, jer kompajlator ne razrješava poziv funkcije, već ga rješava u vrijeme izvođenja.
Da biste saznali više, posjetite naš vodič za nadjačavanje funkcija C ++.
C ++ virtualne funkcije
U C ++-u možda nećemo moći nadjačati funkcije ako upotrijebimo pokazivač osnovne klase za usmjeravanje na objekt izvedene klase.
Korištenje virtualnih funkcija u osnovnoj klasi osigurava mogućnost nadjačavanja funkcije u tim slučajevima.
Dakle, virtualne funkcije zapravo potpadaju pod nadjačavanje funkcije . Na primjer,
// 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.