Поліморфізм С ++

У цьому підручнику ми дізнаємося про поліморфізм в 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 ++, використовуючи такі способи:

  1. Перевантаження функції
  2. Перевантаження оператора
  3. Перевизначення функції
  4. Віртуальні функції

Перевантаження функції 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.

Цікаві статті...