C ++ polymorfisme

In deze tutorial leren we met behulp van voorbeelden over polymorfisme in C ++.

Polymorfisme is een belangrijk concept van objectgeoriënteerd programmeren. Het betekent gewoon meer dan één formulier. Dat wil zeggen, dezelfde entiteit (functie of operator) gedraagt ​​zich anders in verschillende scenario's. Bijvoorbeeld,

De +operator in C ++ wordt gebruikt om twee specifieke functies uit te voeren. Wanneer het wordt gebruikt met getallen (gehele getallen en getallen met drijvende komma), voert het optelling uit.

 int a = 5; int b = 6; int sum = a + b; // sum = 11

En wanneer we de +operator met strings gebruiken, voert deze stringconcatenatie uit. Bijvoorbeeld,

 string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;

We kunnen polymorfisme in C ++ implementeren op de volgende manieren:

  1. Functie overbelast
  2. Operator overbelast
  3. Functie overschrijven
  4. Virtuele functies

C ++ Functie Overbelasting

In C ++ kunnen we twee functies met dezelfde naam gebruiken als ze verschillende parameters hebben (typen of aantal argumenten).

En, afhankelijk van het aantal / type argumenten, worden verschillende functies aangeroepen. Bijvoorbeeld,

 // 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; )

Uitvoer

 Som 1 = 11 Som 2 = 12,1 Som 3 = 18

Hier hebben we 3 verschillende sum()functies gemaakt met verschillende parameters (aantal / type parameters). En, op basis van de argumenten die worden doorgegeven tijdens een functieaanroep, wordt een bepaalde sum()aangeroepen.

Het is een polymorfisme tijdens het compileren omdat de compiler weet welke functie moet worden uitgevoerd voordat het programma wordt gecompileerd.

Voor meer informatie, bezoek onze C ++ Function Overloading tutorial.

Overbelasting door C ++ operator

In C ++ kunnen we een operator overbelasten zolang we werken met door de gebruiker gedefinieerde typen zoals objecten of structuren.

We kunnen geen gebruik maken van operator overbelasting voor basistypen zoals int, doubleetc.

Overbelasting van de operator is in feite overbelasting van functies, waarbij verschillende operatorfuncties hetzelfde symbool maar verschillende operanden hebben.

En, afhankelijk van de operanden, worden verschillende operatorfuncties uitgevoerd. Bijvoorbeeld,

 // 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; )

Uitvoer

 Aantal: 6

Hier hebben we de ++operator overbelast , die werkt op objecten van Countklasse (in dit geval object count1).

We hebben deze overbelaste operator gebruikt om de waardevariabele van count1-object rechtstreeks te verhogen met 1.

Dit is ook een polymorfisme tijdens het compileren .

Voor meer informatie, bezoek onze C ++ Operator Overloading tutorial.

C ++ Functie overschrijven

Bij overerving van C ++ kunnen we dezelfde functie hebben in de basisklasse en de afgeleide klassen ervan.

Wanneer we de functie aanroepen met een object van de afgeleide klasse, wordt de functie van de afgeleide klasse uitgevoerd in plaats van die in de basisklasse.

Er worden dus verschillende functies uitgevoerd, afhankelijk van het object dat de functie aanroept.

Dit staat bekend als functie-overschrijving in C ++. Bijvoorbeeld,

 // 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; )

Uitvoer

 Afgeleide functie

Hier hebben we een print()functie in de Baseklasse gebruikt en dezelfde functie in de Derivedklasse

Wanneer we het print()gebruik van het Derivedobject afgeleid1 aanroepen, overschrijft het de print()functie van Basedoor de print()functie van de Derivedklasse uit te voeren.

Het is een runtime-polymorfisme omdat de functieaanroep niet wordt opgelost door de compiler, maar in plaats daarvan in de runtime.

Ga voor meer informatie naar onze zelfstudie C ++ Function Overriding.

C ++ virtuele functies

In C ++ kunnen we functies mogelijk niet overschrijven als we een pointer van de basisklasse gebruiken om naar een object van de afgeleide klasse te verwijzen.

Het gebruik van virtuele functies in de basisklasse zorgt ervoor dat de functie in deze gevallen kan worden overschreven.

Aldus virtuele functies feitelijk tot functie hoger . Bijvoorbeeld,

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

Interessante artikelen...