В този урок ще научим за полиморфизма в C ++ с помощта на примери.
Полиморфизмът е важна концепция на обектно-ориентираното програмиране. Това просто означава повече от една форма. Тоест една и съща същност (функция или оператор) се държи по различен начин в различните сценарии. Например,
На +
оператора в C ++ се използва за извършване на две специфични функции. Когато се използва с числа (цели числа и числа с плаваща запетая), той извършва добавяне.
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 ++, като използваме следните начини:
- Претоварване на функцията
- Претоварване на оператора
- Замяна на функцията
- Виртуални функции
Претоварване на функциите на C ++
В C ++ можем да използваме две функции с едно и също име, ако имат различни параметри (или типове, или брой аргументи).
И в зависимост от броя / типа аргументи се извикват различни функции. Например,
// 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()
.
Това е полиморфизъм по време на компилация, защото компилаторът знае коя функция да изпълни, преди програмата да бъде компилирана.
За да научите повече за, посетете нашия урок за претоварване на функции C ++.
Претоварване на оператора C ++
В C ++ можем да претоварим оператор, стига да работим върху дефинирани от потребителя типове като обекти или структури.
Не можем да използваме претоварване на оператор за основни типове като 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
клас (в този случай object count1).
Използвахме този претоварен оператор, за да увеличим директно стойността на променливата на count1 обект с 1
.
Това също е полиморфизъм по време на компилация .
За да научите повече, посетете нашия урок за претоварване на оператора C ++.
Замяна на функцията на C ++
В наследяването на C ++ можем да имаме същата функция в базовия клас, както и неговите производни класове.
Когато извикаме функцията, използвайки обект от производния клас, функцията на производния клас се изпълнява вместо тази в основния клас.
Така че, различни функции се изпълняват в зависимост от обекта, който извиква функцията.
Това е известно като заместване на функцията в C ++. Например,
// 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 ++.
Виртуални функции на C ++
В C ++ може да не сме в състояние да заменим функциите, ако използваме указател на базовия клас, за да сочим към обект от производния клас.
Използването на виртуални функции в базовия клас гарантира , че функцията може да бъде заменена в тези случаи.
По този начин виртуалните функции всъщност попадат под замяна на функцията . Например,
// 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.