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клас (в този случай 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.

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