У цьому підручнику ми дізнаємося про поліморфізм в 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
класу (у цьому випадку об’єкт count1).
Ми використовували цей перевантажений оператор для безпосереднього збільшення змінної значення об'єкта count1 на 1
.
Це також поліморфізм під час компіляції .
Щоб дізнатись більше, відвідайте наш підручник з перевантаження оператора 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.