¿Qué es el polimorfismo en C ++?
IC ++, el polimorfismo hace que la función de un miembro se comporte de manera diferente según el objeto que llama / invoca. El polimorfismo es una palabra griega que significa muchas formas. Ocurre cuando tienes una jerarquía de clases relacionadas por herencia.
Por ejemplo, probablemente tengamos la función makeSound (). Cuando un gato llama a esta función, producirá un maullido. Cuando una vaca invoca la misma función, proporcionará el sonido muuu.
Aunque tenemos una función, se comporta de manera diferente en diferentes circunstancias. La función toma muchas formas; así que hemos logrado el polimorfismo.
En este tutorial de C ++, aprenderá:
Tipos de polimorfismo
C ++ admite dos tipos de polimorfismo:
- Polimorfismo compilado en el tiempo y
- Tiempo de ejecución de polimorfismo.
Tiempo de compilación de polimorfismo
Discute las funciones de sobrecarga 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 ++ selecciona la función correcta en tiempo de compilación.
El polimorfismo del tiempo de compilación se logra mediante la sobrecarga de funciones y la sobrecarga del operador.
Sobrecarga de funciones
La sobrecarga de funciones ocurre cuando tenemos muchas funciones con nombres similares pero argumentos diferentes. Los argumentos pueden diferir en 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; }
Producción:
Aquí hay una imagen del código:
Explicación del Código:
- Incluya el archivo de encabezado de iostream en nuestro código. Podremos utilizar sus funciones.
- Incluya el nombre del espacio estándar en nuestro código. Podremos usar sus clases sin llamarlo.
- Cree una prueba de denominación de funciones que tome un parámetro entero i. La {marca el comienzo del cuerpo de la prueba funcional.
- Declaración que debe realizarse si se invoca / llama a la prueba funcional anterior.
- El cuerpo final de la prueba funcional anterior.
- Cree una prueba de nomenclatura funcional que tome un parámetro flotante f. La {marca el comienzo del cuerpo de la prueba funcional.
- Declaración que debe realizarse si se invoca / llama a la prueba funcional anterior.
- El cuerpo final de la prueba funcional anterior.
- Cree una prueba de denominación funcional que tome un parámetro de carácter de ch. La {marca el comienzo del cuerpo de la prueba funcional.
- Declaración que debe realizarse si se invoca / llama a la prueba funcional anterior.
- El cuerpo final de la prueba funcional anterior.
- Llame a la función principal (). {Marca el comienzo del cuerpo de la función.
- Llame a la prueba funcional y pase 5 con ella como valor del argumento. Esto reemplaza la función de prueba que asume un argumento entero, es decir, la primera función de prueba.
- Llame a la prueba funcional y reenvíe 5.5 con ella como valor del argumento. Esto invocará la función de prueba que acepta un argumento flotante, es decir, la segunda función de prueba.
- Llame a la prueba funcional y agregue cinco como 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.
- Fin de la función principal del cuerpo ().
Tenemos tres funciones con el mismo nombre pero diferentes tipos de argumentos. Hemos logrado el polimorfismo.
Sobrecarga del operador
En Operator Overload, definimos un nuevo significado para el operador C ++. También cambia la forma en que trabaja el operador. Por ejemplo, podemos definir el operador + para combinar dos conjuntos. Lo conocemos como el operador de la suma para sumar valores numéricos. Después de nuestra definición, cuando se coloca entre números enteros, se sumará. Cuando se coloca entre cuerdas, competirá con ellas.
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(); }
Producción:
Aquí hay una imagen del código:
Explicación del Código:
- Incluya el archivo de encabezado de iostream en nuestro programa para usar sus funciones.
- Incluya el nombre de espacio estándar en nuestro programa para poder usar sus clases sin llamarlo.
- Cree una clase llamada ComplexNum. La marca {es el comienzo del cuerpo.
- Utilice el modificador de acceso privado para marcar las variables como elementos privados, lo que significa que solo se puede acceder a ellos dentro de la clase.
- Defina dos variables enteras, verdaderas y superiores.
- Utilice el modificador de acceso público para marcar al constructor como público, haciéndolo accesible incluso desde fuera del aula.
- Cree el generador de clases e inicie las variables.
- Comience con el valor de la verdadera variable.
- Empiece de nuevo con el valor de la variable.
- El fin del carrocero.
- Necesitamos trascender el significado de operador +.
- Cree un resultado de tipo de datos ComplexNum.
- Utilice el operador + con números complejos. Esta línea agregará un número real a otro número real.
- Utilice el operador + con números complejos. Esta línea agregará la parte imaginaria de un número a la parte imaginaria de otro número.
- El programa devolverá el valor de la variable resultado en una ejecución exitosa.
- Fin de la definición de nuevo significado + operador, es decir, sobrecarga.
- Llame al método de impresión ().
- Imprima el nuevo número complejo después de colocarlo en la consola.
- El final del cuerpo de la función de impresión ().
- El final del cuerpo de la clase ComplexNum.
- Llame a la función principal ().
- Pasar los valores de las partes reales y complejas que se van a sumar. La primera parte de c1 se agregará a la primera parte de c2, es decir, 10 + 3. La segunda parte de c1 se agregará a la segunda parte de c, es decir, 2 + 7.
- Realice una operación usando el operador overload + y almacenando el resultado en la variable c3.
- Imprime un valor variable de c3 en la consola.
- El final del cuerpo de la función principal ().
Tiempo de ejecución de polimorfismo
Esto ocurre cuando se invoca / llama al modo de 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 una función primordial. La función para llamar / invocar se establece durante el tiempo de ejecución.
Función primordial
Se produce una infracción de la función cuando se redefine una función de una clase primaria en una clase derivada. En ese momento, podemos decir que se violó la función original.
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; }
Producción:
Aquí hay una imagen del código:
Explicación del Código:
- Importe el archivo de encabezado de iostream a nuestro programa para usar sus funciones.
- Incluya el nombre de espacio estándar en nuestro programa para poder usar sus clases sin llamarlo.
- Crea una clase llamada Mamíferos. La marca {es el comienzo del cuerpo.
- Utilice el modificador de acceso público para hacer que la función que estamos a punto de crear sea accesible al público. Será accesible desde fuera de esta clase.
- Crea una función pública llamada comer. La {marca el comienzo del cuerpo funcional.
- Imprime la declaración que se agrega a la función cout cuando se invoca la función eat ().
- El fin del cuerpo de la función de comer ().
- Fin de la clase de mamíferos corporales.
- Cree una clase llamada Vaca que herede la clase Mamífero. La vaca es la clase derivada y mamá es la clase elemental. La marca {es el comienzo de esta clase.
- Utilice el modificador de acceso público para hacer que la función que estamos a punto de crear sea accesible al público. Será accesible desde fuera de esta clase.
- Superar la función de comer () definida en la clase baja. La {marca el comienzo del cuerpo funcional.
- La declaración que se imprimirá en la consola cuando se invoca esta función.
- El final del cuerpo de la función de comer ().
- El final del cuerpo de la vaca.
- Llame a la función principal (). El {marca el comienzo del cuerpo de esta función.
- Cree un ejemplo de la clase Vaca y dé el nombre c.
- Llame a la función de comer () definida en la clase Vaca.
- El programa debe devolver valor una vez completado con éxito.
- Fin de la función principal ().
Función virtual C ++
Otra forma de aplicar el polimorfismo en tiempo de ejecución en C ++ es una función virtual. 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 función en la clase elemental.
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(); }
Producción:
Aquí hay una imagen del código:
Explicación del Código:
- Coloque el archivo de encabezado de iostream en el código para usar sus funciones.
- Incluya el nombre de espacio 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 acceso público.
- Crea un espectáculo virtual llamado show (). Será una función pública.
- El texto se imprime cuando se invoca show (). El endl es una palabra clave de C ++, que significa línea final. Mueve el cursor del mouse a la siguiente línea.
- El final del cuerpo de la función virtual show ().
- El final del cuerpo de la clase ClassA.
- La creación de una nueva clase llamada ClassB hereda la clase ClassA. ClassA se convierte en principiante y la clase derivada se convierte en ClassB.
- Utilice el modificador de acceso público para marcar un miembro de la clase como acceso público.
- El programa redefinió una función virtual () derivada de la clase base.
- El texto que se imprimirá en la consola cuando se invoca la función show () definida en la clase derivada.
- El final del cuerpo de la función show ().
- El final del cuerpo de la clase derivada, ClassB.
- Llame a la función principal (). La lógica del programa debe agregarse dentro de su cuerpo.
- Cree una variable de puntero denominada a. Se centra en la clase llamada ClassA.
- Cree un ejemplo de una clase llamada ClassB. El nombre b.
- Asigne los valores a la dirección b en la variable a.
- Invite a la función show () definida en la clase derivada. Se ha implementado la vinculación tardía.
- El final del cuerpo de la función principal ().
Tiempo de compilación de polimorfismo vs. Polimorfismo Rith-Am
Aquí están las grandes diferencias entre los dos:
Polimorfismo compilado en el tiempo | Polimorfismo en tiempo de ejecución |
También se llama polimorfismo estático o de unión temprana. | También se le llama polimorfismo de enlace tardío / dinámico / dinámico. |
El método se proporciona / invoca durante el tiempo de compilación. | El método se proporciona / invoca durante el tiempo de ejecución. |
Implementado mediante sobrecarga de funciones y sobrecarga del operador | Implementado reemplazando métodos de métodos y funciones virtuales |
Ejemplo, sobrecarga de métodos. Muchos métodos pueden tener nombres similares pero diferentes números o tipos de argumentos | Ejemplo, método infractor. Muchos métodos pueden tener un nombre y un prototipo similares. |
Ejecución más rápida ya que los métodos se descubren durante el tiempo de compilación | La ejecución es más lenta ya que el método se detecta durante el tiempo de ejecución. |
Proporciona menos flexibilidad para resolver problemas ya que todo se conoce durante el tiempo de compilación. | Ofrece mucha flexibilidad para resolver problemas complejos, ya que los métodos se descubren durante el tiempo de ejecución. |
Resumen:
- Polimorfismo significa que hay muchas formas.
- Ocurre cuando existe una jerarquía de clases relacionadas por herencia.
- Con el polimorfismo, una función puede comportarse de manera diferente según el objeto que la invoca / llama.
- En el polimorfismo en tiempo de compilación, se establece la función a invocar durante el tiempo de compilación.
- En el polimorfismo en tiempo de ejecución, la función que se va a invocar se establece durante el tiempo de ejecución.
- El polimorfismo del tiempo de compilación está determinado por la sobrecarga de funciones y la sobrecarga del operador.
- Para la sobrecarga de funciones, hay muchas funciones que tienen 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 una función primordial.
- Para una función primordial, una clase derivada proporciona una nueva definición de una función definida en la clase básica.