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