In questo tutorial, impareremo il polimorfismo in C ++ con l'aiuto di esempi.
Il polimorfismo è un concetto importante della programmazione orientata agli oggetti. Significa semplicemente più di una forma. Cioè, la stessa entità (funzione o operatore) si comporta in modo diverso in diversi scenari. Per esempio,
L' +
operatore in C ++ viene utilizzato per eseguire due funzioni specifiche. Quando viene utilizzato con numeri (interi e numeri in virgola mobile), esegue l'addizione.
int a = 5; int b = 6; int sum = a + b; // sum = 11
E quando usiamo l' +
operatore con le stringhe, esegue la concatenazione di stringhe. Per esempio,
string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;
Possiamo implementare il polimorfismo in C ++ usando i seguenti modi:
- Sovraccarico delle funzioni
- Sovraccarico dell'operatore
- Funzione prioritaria
- Funzioni virtuali
Sovraccarico di funzioni C ++
In C ++, possiamo usare due funzioni con lo stesso nome se hanno parametri diversi (tipi o numero di argomenti).
Inoltre, a seconda del numero / tipo di argomenti, vengono chiamate diverse funzioni. Per esempio,
// 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; )
Produzione
Somma 1 = 11 Somma 2 = 12,1 Somma 3 = 18
Qui abbiamo creato 3 diverse sum()
funzioni con diversi parametri (numero / tipo di parametri). E, in base agli argomenti passati durante una chiamata di funzione, sum()
viene chiamato un particolare .
È un polimorfismo in fase di compilazione perché il compilatore sa quale funzione eseguire prima che il programma venga compilato.
Per ulteriori informazioni, visita il nostro tutorial sull'overload di funzioni C ++.
Sovraccarico degli operatori C ++
In C ++, possiamo sovraccaricare un operatore fintanto che operiamo su tipi definiti dall'utente come oggetti o strutture.
Non possiamo usare l'overloading degli operatori per i tipi di base come int
, double
, etc.
Il sovraccarico degli operatori è fondamentalmente un sovraccarico delle funzioni, in cui funzioni operatore diverse hanno lo stesso simbolo ma operandi diversi.
Inoltre, a seconda degli operandi, vengono eseguite diverse funzioni operatore. Per esempio,
// 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; )
Produzione
Conteggio: 6
Qui, abbiamo sovraccaricato l' ++
operatore, che opera su oggetti di Count
classe (object count1 in questo caso).
Abbiamo utilizzato questo operatore sovraccarico per incrementare direttamente la variabile value dell'oggetto count1 di 1
.
Questo è anche un polimorfismo in fase di compilazione .
Per saperne di più, visita il nostro tutorial sull'overload di operatori C ++.
Sostituzione della funzione C ++
Nell'ereditarietà C ++, possiamo avere la stessa funzione nella classe base e nelle sue classi derivate.
Quando chiamiamo la funzione utilizzando un oggetto della classe derivata, viene eseguita la funzione della classe derivata invece di quella della classe base.
Quindi, diverse funzioni vengono eseguite a seconda dell'oggetto che chiama la funzione.
Questo è noto come funzione che sovrascrive in C ++. Per esempio,
// 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; )
Produzione
Funzione derivata
Qui abbiamo usato una print()
funzione nella Base
classe e la stessa funzione nella Derived
classe
Quando chiamiamo print()
usando l' Derived
oggetto derivato1, sovrascrive la print()
funzione di Base
eseguendo la print()
funzione della Derived
classe.
È un polimorfismo di runtime perché la chiamata alla funzione non viene risolta dal compilatore, ma viene invece risolta nel runtime.
Per saperne di più, visita il nostro tutorial sull'override delle funzioni C ++.
Funzioni virtuali C ++
In C ++, potremmo non essere in grado di sovrascrivere le funzioni se usiamo un puntatore della classe base per puntare a un oggetto della classe derivata.
L'utilizzo di funzioni virtuali nella classe base garantisce che la funzione possa essere sovrascritta in questi casi.
Pertanto, le funzioni virtuali rientrano effettivamente nella funzione di override . Per esempio,
// 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.