Polimorfizm C ++

W tym samouczku nauczymy się polimorfizmu w C ++ na przykładach.

Polimorfizm to ważna koncepcja programowania obiektowego. Oznacza po prostu więcej niż jedną formę. Oznacza to, że ta sama jednostka (funkcja lub operator) zachowuje się różnie w różnych scenariuszach. Na przykład,

+Operator C ++ służy do wykonywania dwóch specyficznych funkcji. Gdy jest używany z liczbami (liczbami całkowitymi i liczbami zmiennoprzecinkowymi), wykonuje dodawanie.

 int a = 5; int b = 6; int sum = a + b; // sum = 11

Kiedy używamy +operatora ze stringami, wykonuje on konkatenację łańcuchów. Na przykład,

 string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;

Możemy zaimplementować polimorfizm w C ++ w następujący sposób:

  1. Przeciążanie funkcji
  2. Przeciążanie operatorów
  3. Funkcja nadrzędna
  4. Funkcje wirtualne

Przeciążanie funkcji C ++

W C ++ możemy użyć dwóch funkcji o tej samej nazwie, jeśli mają różne parametry (typy lub liczbę argumentów).

W zależności od liczby / typu argumentów wywoływane są różne funkcje. Na przykład,

 // 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; )

Wynik

 Suma 1 = 11 Suma 2 = 12,1 Suma 3 = 18

Tutaj stworzyliśmy 3 różne sum()funkcje z różnymi parametrami (liczba / typ parametrów). I na podstawie argumentów przekazanych podczas wywołania funkcji wywoływany sum()jest konkret.

Jest to polimorfizm w czasie kompilacji, ponieważ kompilator wie, którą funkcję wykonać, zanim program zostanie skompilowany.

Aby dowiedzieć się więcej, odwiedź nasz samouczek dotyczący przeciążania funkcji języka C ++.

Przeciążanie operatorów C ++

W C ++ możemy przeciążać operatora, o ile działamy na typach zdefiniowanych przez użytkownika, takich jak obiekty lub struktury.

Nie możemy użyć operatora przeciążenia dla podstawowych typów, takich jak int, doubleitp

Przeciążanie operatorów to w zasadzie przeciążanie funkcji, gdzie różne funkcje operatora mają ten sam symbol, ale różne operandy.

W zależności od operandów wykonywane są różne funkcje operatora. Na przykład,

 // 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; )

Wynik

 Liczba: 6

Tutaj przeładowaliśmy ++operator, który operuje na obiektach Countklasy (w tym przypadku obiekt count1).

Użyliśmy tego przeciążonego operatora do bezpośredniego zwiększenia wartości zmiennej obiektu count1 o 1.

Jest to również polimorfizm w czasie kompilacji .

Aby dowiedzieć się więcej, odwiedź nasz samouczek dotyczący przeciążania operatorów języka C ++.

Zastępowanie funkcji C ++

W dziedziczeniu w C ++ możemy mieć tę samą funkcję w klasie bazowej, jak również w jej klasach pochodnych.

Kiedy wywołujemy funkcję przy użyciu obiektu klasy pochodnej, funkcja klasy pochodnej jest wykonywana zamiast funkcji z klasy bazowej.

Zatem różne funkcje są wykonywane w zależności od obiektu wywołującego funkcję.

Jest to znane jako przesłanianie funkcji w C ++. Na przykład,

 // 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; )

Wynik

 Funkcja pochodna

Tutaj użyliśmy print()funkcji w Baseklasie i tej samej funkcji w Derivedklasie

Kiedy wywołujemy print()przy użyciu Derivedobiektu pochodnego1, przesłania on print()funkcję Baseprzez wykonanie print()funkcji Derivedklasy.

Jest to polimorfizm w czasie wykonywania, ponieważ wywołanie funkcji nie jest rozpoznawane przez kompilator, ale zamiast tego jest rozwiązywane w środowisku wykonawczym.

Aby dowiedzieć się więcej, odwiedź nasz samouczek dotyczący zastępowania funkcji języka C ++.

Funkcje wirtualne C ++

W C ++ możemy nie być w stanie przesłonić funkcji, jeśli użyjemy wskaźnika klasy bazowej do wskazania obiektu klasy pochodnej.

Użycie funkcji wirtualnych w klasie bazowej zapewnia, że w takich przypadkach funkcja może zostać zastąpiona.

W ten sposób funkcje wirtualne w rzeczywistości podlegają nadpisywaniu funkcji . Na przykład,

 // 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.

Interesujące artykuły...