En este tutorial, aprenderemos sobre el polimorfismo en C ++ con la ayuda de ejemplos.
El polimorfismo es un concepto importante de la programación orientada a objetos. Simplemente significa más de una forma. Es decir, la misma entidad (función u operador) se comporta de manera diferente en diferentes escenarios. Por ejemplo,
El +
operador en C ++ se utiliza para realizar dos funciones específicas. Cuando se usa con números (enteros y números de punto flotante), realiza sumas.
int a = 5; int b = 6; int sum = a + b; // sum = 11
Y cuando usamos el +
operador con cadenas, realiza una concatenación de cadenas. Por ejemplo,
string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;
Podemos implementar polimorfismo en C ++ usando las siguientes formas:
- Sobrecarga de funciones
- Sobrecarga del operador
- Función anulada
- Funciones virtuales
Sobrecarga de funciones de C ++
En C ++, podemos usar dos funciones que tengan el mismo nombre si tienen diferentes parámetros (ya sea tipos o número de argumentos).
Y, dependiendo del número / tipo de argumentos, se llaman a diferentes funciones. Por ejemplo,
// 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; )
Salida
Suma 1 = 11 Suma 2 = 12,1 Suma 3 = 18
Aquí, hemos creado 3 sum()
funciones diferentes con diferentes parámetros (número / tipo de parámetros). Y, según los argumentos pasados durante la llamada a una función, se llama a un particular sum()
.
Es un polimorfismo en tiempo de compilación porque el compilador sabe qué función ejecutar antes de compilar el programa.
Para obtener más información, visite nuestro tutorial de sobrecarga de funciones de C ++.
Sobrecarga del operador C ++
En C ++, podemos sobrecargar un operador siempre que estemos operando en tipos definidos por el usuario como objetos o estructuras.
No podemos utilizar la sobrecarga de operadores para los tipos básicos tales como int
, double
, etc.
La sobrecarga del operador es básicamente una sobrecarga de funciones, donde diferentes funciones del operador tienen el mismo símbolo pero diferentes operandos.
Y, dependiendo de los operandos, se ejecutan diferentes funciones de operador. Por ejemplo,
// 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; )
Salida
Cuenta: 6
Aquí, hemos sobrecargado el ++
operador, que opera sobre objetos de Count
clase (objeto count1 en este caso).
Hemos utilizado este operador sobrecargado para incrementar directamente la variable de valor del objeto count1 en 1
.
Esto también es un polimorfismo en tiempo de compilación .
Para obtener más información, visite nuestro tutorial C ++ Operator Overloading.
Anulación de funciones de C ++
En la herencia de C ++, podemos tener la misma función en la clase base y sus clases derivadas.
Cuando llamamos a la función usando un objeto de la clase derivada, se ejecuta la función de la clase derivada en lugar de la de la clase base.
Entonces, se ejecutan diferentes funciones dependiendo del objeto que llama a la función.
Esto se conoce como anulación de funciones en C ++. Por ejemplo,
// 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; )
Salida
Función derivada
Aquí, hemos usado una print()
función en la Base
clase y la misma función en la Derived
clase.
Cuando llamamos print()
usando el Derived
objeto derivado1, anula la print()
función de Base
ejecutando la print()
función de la Derived
clase.
Es un polimorfismo en tiempo de ejecución porque el compilador no resuelve la llamada a la función, sino que se resuelve en el tiempo de ejecución.
Para obtener más información, visite nuestro tutorial de sustitución de funciones de C ++.
Funciones virtuales de C ++
En C ++, es posible que no podamos anular funciones si usamos un puntero de la clase base para apuntar a un objeto de la clase derivada.
El uso de funciones virtuales en la clase base garantiza que la función pueda anularse en estos casos.
Por lo tanto, las funciones virtuales realmente caen bajo la función de anulación . Por ejemplo,
// 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.