C ++ polimorfizam

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:

  1. Preopterećenje funkcije
  2. Preopterećenje operatera
  3. Nadjačavanje funkcije
  4. 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, doubleitd

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 Countklase (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 Baseklasi i istu funkciju u Derivedklasi

Kada zovemo print()pomoću Derivedobjekta izvedenog1, on nadjačava print()funkciju Baseizvršavanjem print()funkcije Derivedklase.

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.

Zanimljivi članci...