Полиморфизм C ++

В этом руководстве мы узнаем о полиморфизме в 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 ++. Например,

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

Интересные статьи...