polymorphism c
Papel del polimorfismo en C ++ con ejemplos.
El polimorfismo es uno de los cuatro pilares de la programación orientada a objetos. El polimorfismo significa tener muchas formas. Se puede definir como la técnica mediante la cual un objeto puede adoptar muchas formas dependiendo de la situación.
En términos de programación, podemos decir que un objeto puede comportarse de manera diferente en diferentes condiciones.
En este tutorial, aprenderemos sobre los tipos de polimorfismo, las formas de implementar el polimorfismo junto con los otros conceptos de polimorfismo en detalle.
=> Consulte aquí para ver los tutoriales de capacitación de la A a la Z de C ++ aquí.
Por ejemplo, una mujer puede asumir muchos roles en diferentes situaciones. Para un niño, es madre, ama de casa en casa, trabajadora en la oficina, etc. Entonces, una mujer asume diferentes roles y exhibe diferentes comportamientos en diferentes condiciones. Este es un ejemplo real de polimorfismo.
De manera similar, también en el mundo de la programación, podemos tener un operador '+' que es el operador de suma binaria que se comporta de manera diferente cuando los operandos cambian. Por ejemplo, cuando ambos operandos son numéricos, realiza una suma.
Por otro lado, cuando los operandos son cadenas, actúa como operador de concatenación. Por lo tanto, polimorfismo, en pocas palabras, significa una entidad que adopta muchas formas o se comporta de manera diferente en diferentes condiciones.
Lo que vas a aprender:
diferencia entre los comandos de Unix y Linux
- Tipos de polimorfismo
- Compilar polimorfismo de tiempo vs. Polimorfismo en tiempo de ejecución
- Compilar polimorfismo de tiempo
- Sobrecarga de funciones
- Sobrecarga del operador
- Conclusión
- Lectura recomendada
Tipos de polimorfismo
El polimorfismo se divide en dos tipos.
- Compilar polimorfismo de tiempo
- Polimorfismo en tiempo de ejecución
El diagrama para representar esto se muestra a continuación:
Como se muestra en el diagrama anterior, el polimorfismo se divide en polimorfismo en tiempo de compilación y polimorfismo en tiempo de ejecución. El polimorfismo de tiempo de compilación se divide a su vez en sobrecarga de operadores y sobrecarga de funciones. El polimorfismo en tiempo de ejecución se implementa aún más mediante funciones virtuales.
El polimorfismo en tiempo de compilación también se conoce como polimorfismo de enlace temprano o estático. En este tipo de polimorfismo, el método del objeto se invoca en el momento de la compilación. En el caso del polimorfismo en tiempo de ejecución, el método del objeto se invoca en tiempo de ejecución.
El polimorfismo en tiempo de ejecución también se conoce como polimorfismo dinámico o de enlace tardío o dinámico. Analizaremos la implementación detallada de cada una de estas técnicas en los siguientes temas.
Compilar polimorfismo de tiempo vs. Polimorfismo en tiempo de ejecución
Veamos las principales diferencias entre el tiempo de compilación y el polimorfismo en tiempo de ejecución a continuación.
Compilar polimorfismo de tiempo | Polimorfismo en tiempo de ejecución |
---|---|
También conocido como polimorfismo estático o unión temprana | También conocido como polimorfismo dinámico o unión tardía / dinámica |
El método de objetos se invoca en tiempo de compilación | El método del objeto se invoca en tiempo de ejecución. |
Suele implementarse mediante la sobrecarga del operador y la sobrecarga de funciones | Implementado usando funciones virtuales y anulación de métodos |
La sobrecarga de métodos es un polimorfismo en tiempo de compilación en el que más de un método puede tener el mismo nombre pero diferentes tipos y listas de parámetros. | La anulación de método es el polimorfismo en tiempo de ejecución donde más de un método tiene el mismo nombre con el mismo prototipo |
Dado que los métodos se conocen en tiempo de compilación, la ejecución es más rápida | La ejecución es más lenta ya que el método se conoce en tiempo de ejecución |
Proporcionar menos flexibilidad para implementar soluciones, ya que todo debe conocerse en el momento de la compilación. | Mucho más flexible para implementar soluciones complejas ya que los métodos se deciden en tiempo de ejecución |
Compilar polimorfismo de tiempo
El polimorfismo en tiempo de compilación es una técnica en la que se invoca el método de un objeto en el tiempo de compilación.
Este tipo de polimorfismo se implementa de dos formas.
- Sobrecarga de funciones
- Sobrecarga del operador
Discutiremos cada técnica en detalle.
Sobrecarga de funciones
Se dice que una función está sobrecargada cuando tenemos más de una función con el mismo nombre pero diferentes tipos de parámetros o un número diferente de argumentos.
Por lo tanto, una función se puede sobrecargar según los tipos de parámetros, el orden de los parámetros y el número de parámetros.
Tenga en cuenta que dos funciones que tienen el mismo nombre y la misma lista de parámetros pero un tipo de retorno diferente no es una función sobrecargada y dará como resultado un error de compilación si se usa en el programa.
De manera similar, cuando los parámetros de la función difieren solo en el puntero y si el tipo de matriz es equivalente, entonces no debe usarse para sobrecargar.
Otros tipos como estático y no estático, constante y volátil, etc. O declaraciones de parámetros que difieren en presencia o ausencia de valores predeterminados tampoco deben usarse para sobrecargas, ya que son equivalentes desde el punto de vista de implementación.
Por ejemplo,los siguientes prototipos de funciones son funciones sobrecargadas.
|_+_|En los prototipos anteriores vemos que sobrecargamos la función Agregar en función del tipo de parámetros, secuencia u orden de parámetros, número de parámetros, etc.
Tomemos un ejemplo de programación completo para comprender mejor la sobrecarga de funciones.
|_+_|Producción:
35
191
19
Hola Mundo
En el programa anterior, tenemos una clase de suma que definió tres funciones sobrecargadas llamadas Agregar que toma dos argumentos enteros, tres argumentos enteros y dos argumentos de cadena.
En la función principal, hacemos cuatro llamadas a funciones que proporcionan varios parámetros. Las dos primeras llamadas a funciones son sencillas. En la tercera llamada de función a Agregar, proporcionamos dos valores de punto flotante como argumentos.
En este caso, la función que coincide es int Add (int, int) ya que internamente, el flotante se convierte en doble y luego se empareja con la función con los parámetros int. Si hubiéramos especificado double en lugar de float, entonces tendríamos otra función sobrecargada con double como parámetros.
La última llamada a la función utiliza valores de cadena como parámetros. En este caso, el operador Agregar (+) actúa como un operador de concatenación y concatena los dos valores de cadena para producir una sola cadena.
Beneficios de la sobrecarga de funciones
El principal beneficio de la sobrecarga de funciones es que promueve la reutilización del código. Podemos tener tantas funciones como sea posible con el mismo nombre siempre que estén sobrecargadas en función del tipo de argumento, la secuencia del argumento y el número de argumentos.
Al hacer esto, es más fácil tener diferentes funciones con el mismo nombre para representar el comportamiento de la misma operación en diferentes condiciones.
Si la sobrecarga de funciones no estuviera presente, habríamos tenido que escribir demasiados tipos diferentes de funciones con nombres diferentes, lo que haría que el código fuera ilegible y difícil de adaptar.
Sobrecarga del operador
La sobrecarga de operadores es la técnica con la que damos un significado diferente a los operadores existentes en C ++. En otras palabras, sobrecargamos los operadores para dar un significado especial a los tipos de datos definidos por el usuario como objetos.
La mayoría de los operadores en C ++ están sobrecargados o se les da un significado especial para que puedan trabajar con tipos de datos definidos por el usuario. Tenga en cuenta que mientras se sobrecarga, la operación básica de los operadores no se altera. La sobrecarga solo le da al operador un significado adicional al mantener su semántica básica igual.
Aunque la mayoría de los operadores se pueden sobrecargar en C ++, hay algunos operadores que no se pueden sobrecargar.
Estos operadores se enumeran en la tabla siguiente.
Operadores |
---|
Operador de resolución de alcance (: :) |
Tamaño de |
selector de miembros (.) |
selector de puntero de miembro (*) |
operador ternario (? :) |
Las funciones que usamos para sobrecargar operadores se denominan ' Funciones del operador ”.
Las funciones del operador son similares a las funciones normales pero con una diferencia. La diferencia es que el nombre de las funciones del operador comienza con la palabra clave ' operador ”Seguido del símbolo del operador que se va a sobrecargar.
A continuación, se llama a la función de operador cuando se utiliza el operador correspondiente en el programa. Estas funciones de operador pueden ser funciones miembro o métodos globales o incluso una función amiga.
La sintaxis general de la función del operador es:
|_+_|Aquí 'operador op' es la función del operador donde el operador es la palabra clave y op es el operador que se va a sobrecargar. Return_type es el tipo de valor que se devolverá.
VPN Alemania gratis
Veamos algunos ejemplos de programación para demostrar la sobrecarga del operador usando funciones de operador.
Ejemplo 1:Sobrecarga del operador unario usando la función de operador miembro.
|_+_|Producción:
Valor de pies incrementados: 10
Aquí hemos sobrecargado el operador de incremento unario usando la función operator ++. En la función principal, usamos este operador ++ para incrementar el objeto de la clase Distancia.
Ejemplo 2:Sobrecarga del operador binario usando la función de operador miembro.
|_+_|Producción:
c1 = 2 + i5
c2 = 3 + i7
c3 = c1 + c2 = 5 + i12
Aquí hemos usado el ejemplo clásico de la suma de dos números complejos usando la sobrecarga del operador. Definimos una clase para representar números complejos y una función de operador para sobrecargar + operador en la que sumamos las partes real e imaginaria de números complejos.
En la función principal, declaramos dos objetos complejos y los agregamos usando el operador + sobrecargado para obtener el resultado deseado.
En el siguiente ejemplo, usaremos la función de amigo para sumar dos números complejos para ver la diferencia en la implementación.
|_+_|Producción:
c1 = 2 + i5
c2 = 3 + i7
c3 = c1 + c2 = 5 + i12
Vemos que la salida del programa es la misma. La única diferencia en la implementación es el uso de la función de amigo para sobrecargar el operador + en lugar de una función miembro en la implementación anterior.
Cuando la función amiga se usa para un operador binario, tenemos que especificar explícitamente ambos operandos para la función. De manera similar, cuando el operador unario está sobrecargado con la función friend, necesitamos proporcionar el operando único a la función.
Aparte de las funciones del operador, también podemos escribir un operador de conversión que se utiliza para convertir de un tipo a otro. Estos operadores de conversión sobrecargados deberían ser una función miembro de la clase.
Ejemplo 3:Sobrecarga del operador mediante el operador de conversión.
|_+_|Producción:
El valor resultante de la fracción dada (3,5) = 0,6
En este programa, hemos utilizado el operador de conversión para convertir la fracción dada en un valor flotante. Una vez que se realiza la conversión, el operador de conversión devuelve el valor resultante a la persona que llama.
En la función principal, cuando asignamos el objeto df a una variable res_val, se realiza la conversión y el resultado se almacena en res_val.
También podemos llamar a un constructor con un solo argumento. Cuando podemos llamar a un constructor de la clase usando un solo argumento, esto se llama ' conversión constructor ”. El constructor de conversión se puede utilizar para la conversión implícita a la clase que se está construyendo.
|_+_|Producción:
Punto construido usando un constructor normal
x = 20 y = 30
Punto construido usando el constructor de conversión
x = 10 y = 0
Aquí tenemos una clase Point que define un constructor con valores predeterminados. En la función principal, construimos un objeto pt con coordenadas xey. A continuación, simplemente asignamos a pt un valor de 10. Aquí es donde se llama al constructor de conversión ya x se le asigna un valor de 10 mientras que a y se le da el valor predeterminado de 0.
Reglas de sobrecarga del operador
Al realizar la sobrecarga del operador, debemos tener cuidado con las siguientes reglas.
- En C ++, solo podemos sobrecargar los operadores existentes. Los operadores recién agregados no se pueden sobrecargar.
- Cuando los operadores están sobrecargados, debemos asegurarnos de que al menos uno de los operandos sea del tipo definido por el usuario.
- Para sobrecargar ciertos operadores, también podemos hacer uso de la función de amigo.
- Cuando sobrecargamos operadores unarios usando una función miembro, no se necesitan argumentos explícitos. Se necesita un argumento explícito cuando el operador unario está sobrecargado con la función de amigo.
- De manera similar, cuando los operadores binarios están sobrecargados usando una función miembro, tenemos que proporcionar un argumento explícito a la función. Cuando los operadores binarios se sobrecargan con la función de amigo, la función toma dos argumentos.
- Hay dos operadores en C ++ que ya están sobrecargados. Estos son '=' y '&'. Por lo tanto, para copiar un objeto de la misma clase, no necesitamos sobrecargar el operador = y podemos usarlo directamente.
Ventajas de la sobrecarga del operador
La sobrecarga de operadores en C ++ nos permite extender la funcionalidad de los operadores a los tipos definidos por el usuario, incluidos los objetos de clase además de los tipos integrados.
Al extender la funcionalidad del operador a los tipos definidos por el usuario, no necesitamos escribir código complejo para realizar varias operaciones en tipos definidos por el usuario, pero podemos hacerlo en una sola operación al igual que los tipos integrados.
Conclusión
El polimorfismo de tiempo de compilación proporciona una función de sobrecarga principalmente para ampliar la funcionalidad del código en términos de sobrecarga de funciones y sobrecarga de operadores.
A través de la sobrecarga de funciones, podemos escribir más de una función con el mismo nombre pero con diferentes parámetros y tipos. Esto hace que el código sea simple y fácil de leer. Mediante la sobrecarga de operadores, podemos ampliar la funcionalidad de los operadores, de modo que también podamos realizar operaciones básicas en tipos definidos por el usuario.
En nuestro próximo tutorial, aprenderemos más sobre el polimorfismo en tiempo de ejecución en C ++.
=> Lea la serie de formación Easy C ++.
Lectura recomendada
- Polimorfismo en tiempo de ejecución en C ++
- Funciones de amigo en C ++
- Recursión en C ++
- Tutorial de la función principal de Python con ejemplos prácticos
- Una descripción completa de C ++
- Tutorial de QTP n. ° 21: cómo hacer que las pruebas de QTP sean modulares y reutilizables usando acciones y bibliotecas de funciones
- Tutorial de Unix Pipes: Pipes en la programación Unix
- Funciones de biblioteca en C ++