Polimorfismo de C++ con ejemplo
¿Qué es el polimorfismo en C++?
En C++, el polimorfismo hace que una función miembro se comporte de manera diferente según el objeto que la llama/invoca. Polimorfismo es una palabra griega que significa tener muchas formas. Ocurre cuando tienes una jerarquía de clases relacionadas a través de la herencia.
Por ejemplo, supongamos que tenemos la función hacerSonido(). Cuando un gato llama a esta función, producirá el sonido de maullido. Cuando una vaca invoca la misma función, proporcionará el sonido de maullido.
Aunque tenemos una función, se comporta de manera diferente bajo diferentes circunstancias. La función tiene muchas formas; por lo tanto, hemos logrado el polimorfismo.
En este tutorial de C++, aprenderá:
- ¿Qué es el polimorfismo?
- Tipos de polimorfismo
- Compilar polimorfismo de tiempo
- Sobrecarga de funciones
- Sobrecarga del operador
- Polimorfismo en tiempo de ejecución
- Sustitución de funciones
- Función virtual de C++
- Polimorfismo en tiempo de compilación vs. Polimorfismo en tiempo de ejecución
Tipos de polimorfismo
C++ admite dos tipos de polimorfismo:
- polimorfismo en tiempo de compilación, y
- Polimorfismo en tiempo de ejecución.
Compilar polimorfismo de tiempo
Invocas las funciones sobrecargadas haciendo coincidir el número y el tipo de argumentos. La información está presente durante el tiempo de compilación. Esto significa que el compilador de C++ seleccionará la función correcta en el momento de la compilación.
El polimorfismo en tiempo de compilación se logra mediante la sobrecarga de funciones y la sobrecarga de operadores.
Sobrecarga de funciones
La sobrecarga de funciones ocurre cuando tenemos muchas funciones con nombres similares pero diferentes argumentos. Los argumentos pueden diferir en términos de número o tipo.
Ejemplo 1:
#include <iostream> using namespace std; void test(int i) { cout << " The int is " << i << endl; } void test(double f) { cout << " The float is " << f << endl; } void test(char const *ch) { cout << " The char* is " << ch << endl; } int main() { test(5); test(5.5); test("five"); return 0; }
Salida:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Incluya el archivo de encabezado iostream en nuestro código. Podremos utilizar sus funciones.
- Incluya el espacio de nombres estándar en nuestro código. Podremos usar sus clases sin llamarlo.
- Cree una función llamada prueba que tome un parámetro entero i. El { marca el comienzo del cuerpo de la prueba de función.
- Declaración que se ejecutará si se invoca/llama a la prueba de función anterior.
- Fin del cuerpo de la prueba de función anterior.
- Cree una función llamada prueba que tome un parámetro flotante f. El { marca el comienzo del cuerpo de la prueba de función.
- Declaración que se ejecutará si se invoca/llama a la prueba de función anterior.
- Fin del cuerpo de la prueba de función anterior.
- Cree una función llamada prueba que tome un parámetro de carácter ch. El { marca el comienzo del cuerpo de la prueba de función.
- Declaración que se ejecutará si se invoca/llama a la prueba de función anterior.
- Fin del cuerpo de la prueba de función anterior.
- Llama a la función main(). El { marca el comienzo del cuerpo de la función.
- Llama a la función test y pásale 5 como el valor del argumento. Esto invoca la función de prueba que acepta un argumento entero, es decir, la primera función de prueba.
- Llama a la función test y pásale 5.5 como el valor del argumento. Esto invocará la función de prueba que acepta un argumento flotante, es decir, la segunda función de prueba.
- Llama a la función test y pásale cinco como el valor del argumento. Esto invocará la función de prueba que acepta un argumento de carácter, es decir, la tercera función de prueba.
- El programa debe devolver un valor si se ejecuta correctamente.
- El final del cuerpo de la función main().
Tenemos tres funciones con el mismo nombre pero diferentes tipos de argumentos. Hemos logrado el polimorfismo.
Sobrecarga del operador
En Sobrecarga de operadores, definimos un nuevo significado para un operador de C++. También cambia la forma en que trabaja el operador. Por ejemplo, podemos definir el operador + para concatenar dos cadenas. Lo conocemos como el operador de suma para sumar valores numéricos. Después de nuestra definición, cuando se coloca entre enteros, los agregará. Cuando se coloca entre cadenas, las concatenará.
Ejemplo 2:
#include<iostream> using namespace std; class ComplexNum { private: int real, over; public: ComplexNum(int rl = 0, int ov = 0) { real = rl; over = ov; } ComplexNum operator + (ComplexNum const &obj) { ComplexNum result; result.real = real + obj.real; result.over = over + obj.over; return result; } void print() { cout << real << " + i" << over << endl; } }; int main() { ComplexNum c1(10, 2), c2(3, 7); ComplexNum c3 = c1+c2; c3.print(); }
Salida:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Incluya el archivo de encabezado iostream en nuestro programa para usar sus funciones.
- Incluya el espacio de nombres estándar en nuestro programa para usar sus clases sin llamarlo.
- Cree una clase llamada ComplexNum. El { marca el comienzo del cuerpo de la clase.
- Utilice el modificador de acceso privado para marcar las variables como privadas, lo que significa que solo se puede acceder a ellas desde dentro de la clase.
- Defina dos variables enteras, real y superior.
- Utilice el modificador de acceso público para marcar el constructor como público, lo que significa que será accesible incluso desde fuera de la clase.
- Cree el constructor de clases e inicialice las variables.
- Inicializar el valor de la variable real.
- Inicializar el valor de la variable over.
- Fin del cuerpo del constructor.
- Necesitamos anular el significado del operador +.
- Cree el resultado del tipo de datos de tipo ComplexNum.
- Use el operador + con números complejos. Esta línea sumará la parte real de un número a la parte real de otro número.
- Use el operador + con números complejos. Esta línea sumará la parte imaginaria de un número a la parte imaginaria de otro número.
- El programa devolverá el valor de la variable result después de una ejecución exitosa.
- Fin de la definición del nuevo significado del operador +, es decir, sobrecarga.
- Llama al método print().
- Imprima el nuevo número complejo después de la adición en la consola.
- Fin del cuerpo de la función print().
- Fin del cuerpo de la clase ComplexNum.
- Llama a la función main().
- Pase los valores de las partes reales y complejas para sumar. La primera parte de c1 se sumará a la primera parte de c2, es decir, 10+3. A la segunda parte de c se sumará la segunda parte de c1, es decir, 2+7.
- Realice una operación utilizando el operador + sobrecargado y almacene el resultado en la variable c3.
- Imprime el valor de la variable c3 en la consola.
- Fin del cuerpo de la función main().
Polimorfismo en tiempo de ejecución
Esto sucede cuando se invoca/llama al método de un objeto durante el tiempo de ejecución en lugar de durante el tiempo de compilación. El polimorfismo en tiempo de ejecución se logra mediante la anulación de funciones. La función a llamar/invocar se establece durante el tiempo de ejecución.
Anulación de funciones
La anulación de funciones ocurre cuando una función de la clase base recibe una nueva definición en una clase derivada. En ese momento, podemos decir que la función base ha sido anulada.
Por ejemplo:
#include <iostream> using namespace std; class Mammal { public: void eat() { cout << "Mammals eat..."; } }; class Cow: public Mammal { public: void eat() { cout << "Cows eat grass..."; } }; int main(void) { Cow c = Cow(); c.eat(); return 0; }
Salida:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Importe el archivo de encabezado de iostream a nuestro programa para usar sus funciones.
- Incluya el espacio de nombres estándar en nuestro programa para usar sus clases sin llamarlo.
- Cree una clase llamada Mamífero. El { marca el comienzo del cuerpo de la clase.
- Utilice el modificador de acceso público para configurar la función que estamos a punto de crear como de acceso público. Será accesible desde fuera de esta clase.
- Cree una función pública llamada comer. El { marca el comienzo del cuerpo de la función.
- Imprime la instrucción agregada a la función cout cuando se invoca la función eat().
- El final del cuerpo de la función eat().
- Fin del cuerpo de la clase Mammal.
- Cree una clase llamada Vaca que herede la clase Mamífero. Cow es la clase derivada, mientras que Mammal es la clase base. El { marca el comienzo de esta clase.
- Utilice el modificador de acceso público para marcar la función que estamos a punto de crear como de acceso público. Será accesible desde fuera de esta clase.
- Anula la función eat() que se definió en la clase base. El { marca el comienzo del cuerpo de la función.
- La declaración que se imprimirá en la consola cuando se invoque esta función.
- Fin del cuerpo de la función eat().
- Fin del cuerpo de la clase Vaca.
- Llama a la función main(). El { marca el comienzo del cuerpo de esta función.
- Cree una instancia de la clase Vaca y asígnele el nombre c.
- Llama a la función eat() definida en la clase Cow.
- El programa debe devolver un valor al completarse con éxito.
- Fin de la función main().
Función virtual de C++
Una función virtual es otra forma de implementar el polimorfismo en tiempo de ejecución en C++. Es una función especial definida en una clase base y redefinida en la clase derivada. Para declarar una función virtual, debe usar la palabra clave virtual. La palabra clave debe preceder a la declaración de la función en la clase base.
Si se hereda una clase de función virtual, la clase virtual redefine la función virtual para satisfacer sus necesidades. Por ejemplo:
#include <iostream> using namespace std; class ClassA { public: virtual void show() { cout << "The show() function in base class invoked..." << endl; } }; class ClassB :public ClassA { public: void show() { cout << "The show() function in derived class invoked..."; } }; int main() { ClassA* a; ClassB b; a = &b; a->show(); }
Salida:
Aquí hay una captura de pantalla del código:
Explicación del código:
- Incluya el archivo de encabezado iostream en el código para usar sus funciones.
- Incluya el espacio de nombres estándar en nuestro código para usar sus clases sin llamarlo.
- Cree una clase llamada ClassA.
- Utilice el modificador de acceso público para marcar un miembro de la clase como accesible públicamente.
- Cree una función virtual llamada show(). Será una función pública.
- El texto que se imprimirá cuando se invoque el show() invocado. endl es una palabra clave de C++, lo que significa línea final. Mueve el cursor del ratón a la siguiente línea.
- Fin del cuerpo de la función virtual show().
- Fin del cuerpo de la clase ClassA.
- Crear una nueva clase llamada ClassB que hereda la clase ClassA. ClassA se convierte en la clase base mientras que ClassB se convierte en la clase derivada.
- Utilice el modificador de acceso público para marcar un miembro de la clase como accesible públicamente.
- Redefine la función virtual show() derivada de la clase base.
- El texto que se imprimirá en la consola cuando se invoque la función show() definida en la clase derivada.
- Fin del cuerpo de la función show().
- Fin del cuerpo de la clase derivada, ClassB.
- Llama a la función main(). La lógica del programa debe agregarse dentro de su cuerpo.
- Cree una variable de puntero llamada a. Apunta a la clase denominada ClassA.
- Cree una instancia de la clase denominada ClassB. La instancia recibe el nombre b.
- Asigne los valores almacenados en la dirección b en la variable a.
- Invoque la función show() definida en la clase derivada. Se ha implementado el enlace en tiempo de ejecución.
- Fin del cuerpo de la función main().
Polimorfismo en tiempo de compilación vs. Polimorfismo en tiempo de ejecución
Estas son las principales diferencias entre los dos:
Resumen:
- Polimorfismo significa tener muchas formas.
- Ocurre cuando existe una jerarquía de clases relacionadas a través de la herencia.
- Con el polimorfismo, una función puede comportarse de manera diferente según el objeto que la invoque/llame.
- En el polimorfismo en tiempo de compilación, la función que se invocará se establece durante el tiempo de compilación.
- En el polimorfismo en tiempo de ejecución, la función que se invocará se establece durante el tiempo de ejecución.
- El polimorfismo en tiempo de compilación se determina mediante la sobrecarga de funciones y la sobrecarga de operadores.
- En la sobrecarga de funciones, hay muchas funciones con nombres similares pero argumentos diferentes.
- Los parámetros pueden diferir en número o tipo.
- En la sobrecarga de operadores, se define un nuevo significado para los operadores de C++.
- El polimorfismo en tiempo de ejecución se logra mediante la anulación de funciones.
- En la anulación de funciones, una clase derivada da una nueva definición a una función definida en la clase base.
Lenguaje C
- Pasar matriz a una función en programación C++
- Operadores en C++ con Ejemplo:Qué es, Tipos y Programas
- Declaración de caso de cambio de C ++ con EJEMPLO
- C++ Asignación dinámica de arreglos con ejemplo
- Sobrecarga de operadores de C++ con ejemplos
- Estructura C++ con ejemplo
- std::list en C++ con ejemplo
- Funciones de C++ con ejemplos de programas
- Diferencia entre estructura y clase:explicada con el ejemplo de C++
- Función calloc() en la biblioteca C con programa EJEMPLO
- Función free () en la biblioteca C:¿Cómo usar? Aprende con el Ejemplo