У овом упутству ћемо научити о полиморфизму у Ц ++ уз помоћ примера.
Полиморфизам је важан концепт објектно оријентисаног програмирања. То једноставно значи више облика. Односно, исти ентитет (функција или оператор) понаша се различито у различитим сценаријима. На пример,
+
Оператор на Ц ++ се користи за извођење две посебне функције. Када се користи са бројевима (цели бројеви и бројеви са покретном зарезом), он врши сабирање.
int a = 5; int b = 6; int sum = a + b; // sum = 11
А када користимо +
оператор са стринговима, он врши спајање низова. На пример,
string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;
Полиморфизам у Ц ++ можемо применити на следеће начине:
- Преоптерећење функције
- Преоптерећење оператера
- Замена функције
- Виртуелне функције
Преоптерећење функције Ц ++
У Ц ++-у можемо користити две функције са истим именом ако имају различите параметре (било врсте или број аргумената).
И, у зависности од броја / врсте аргумената, позивају се различите функције. На пример,
// 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; )
Оутпут
Збир 1 = 11 Збир 2 = 12,1 Збир 3 = 18
Овде смо креирали 3 различите sum()
функције са различитим параметрима (број / врста параметара). И, на основу аргумената прослеђених током позива функције, позива се одређено sum()
.
То је полиморфизам времена компајлирања, јер компајлер зна коју функцију треба извршити пре него што се програм компајлира.
Да бисте сазнали више о томе, посетите наш водич за преоптерећење функција Ц ++.
Преоптерећење оператора Ц ++
У Ц ++-у можемо преоптеретити оператора све док радимо на кориснички дефинисаним типовима попут објеката или структура.
Ми не можемо да користимо оператор преоптерећења за основне врсте, као што су int
, double
итд
Преоптерећење оператора је у основи преоптерећење функције, где различите функције оператора имају исти симбол, али различите операнде.
И, у зависности од операнда, извршавају се различите функције оператора. На пример,
// 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; )
Оутпут
Тачка: 6
Овде смо преоптеретили ++
оператор који делује на објектима Count
класе (у овом случају објект цоунт1).
Користили смо овај преоптерећени оператор за директно увећавање променљиве вредности објекта цоунт1 за 1
.
Ово је такође полиморфизам током компајлирања .
Да бисте сазнали више, посетите наш водич за преоптерећење оператора Ц ++.
Замена функције Ц ++
У наслеђивању Ц ++ можемо имати исту функцију у основној класи као и њене изведене класе.
Када функцију позивамо помоћу објекта изведене класе, извршава се функција изведене класе уместо оне у основној класи.
Дакле, извршавају се различите функције у зависности од објекта који позива функцију.
Ово је познато као замена функције у Ц ++. На пример,
// 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; )
Оутпут
Изведена функција
Овде смо користили print()
функцију у Base
класи и исту функцију у Derived
класи
Када зовемо print()
помоћу Derived
објекта изведеног1, он надјачава print()
функцију Base
извршавањем print()
функције Derived
класе.
То је рунтиме полиморфизам јер компајлер не разрешава позив функције, већ га решава у рунтимеу.
Да бисте сазнали више, посетите наш водич за замену функција Ц ++.
Ц ++ виртуелне функције
У Ц ++-у можда нећемо моћи надјачати функције ако користимо показивач основне класе да бисмо усмерили на објекат изведене класе.
Коришћење виртуелних функција у основној класи осигурава да се функција може надјачати у овим случајевима.
Дакле, виртуелне функције заправо потпадају под надјачавање функција . На пример,
// 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.