Sobrecarga en lenguajes de programación
La definición de sobrecarga en programación: el nombre de la función es el mismo, la lista de parámetros de la función es diferente (incluido el número de parámetros y el tipo de parámetro) y el tipo de retorno puede ser el mismo o diferente .
La sobrecarga es un método que permite que funciones, operadores, etc. procesen diferentes tipos de datos o acepten diferentes números de parámetros. Hay dos significados diferentes de la palabra sobrecarga: Sobrecarga Es una especie de polimorfismo (. como C++, Java), y existen cuatro formas de polimorfismo:
1 Polimorfismo de función virtual
2 Polimorfismo de plantilla
3 Sobrecarga
4 Conversión
La llamada distinción dinámica y estática es otra clasificación polimórfica basada en el tiempo de enlace. Estrictamente hablando, la sobrecarga es polimorfismo en tiempo de compilación, es decir, polimorfismo estático al compilar. tipos de funciones, se generarán diferentes nombres como int_foo, char_foo, etc. para distinguir las llamadas. Por lo tanto, la sobrecarga aún cumple con la definición de polimorfismo: la capacidad de admitir diferentes comportamientos específicos a través de un único identificador, pero la sobrecarga es un polimorfismo estático, en lugar de un polimorfismo dinámico logrado mediante herencia y funciones virtuales. La sobrecarga no tiene nada que ver con el polimorfismo. Lo que realmente está relacionado con el polimorfismo es la herencia.
Cuando la clase derivada redefine el método virtual de la clase base, la clase base llama dinámicamente al método correspondiente perteneciente a la clase derivada de acuerdo con las diferentes referencias de clase derivada asignadas a ella. Dichas llamadas a métodos se ejecutan durante. compilación Es imposible de determinar. Por lo tanto, dichas direcciones de métodos están vinculadas en tiempo de ejecución (enlace dinámico).
La sobrecarga es solo una característica del lenguaje y una regla gramatical. No tiene nada que ver con el polimorfismo ni con la orientación a objetos.
Sin embargo, existe un término especial para el llamado segundo tipo de sobrecarga: reescribir o redefinir. La diferencia entre sobrecarga y reescritura radica en si la sobrescritura generalmente ocurre entre diferentes clases y existe una relación de herencia, mientras que la sobrecarga generalmente ocurre en una clase o en un fragmento de código.
Características:
Dado que la sobrecarga puede definir funciones con funciones similares en la misma clase, esto proporciona una gran comodidad para que los programadores administren funciones similares de la clase. Por ejemplo, en una clase que define un círculo, es necesario establecer el centro y el radio para determinar un objeto circular. Los programadores no necesitan configurar dos funciones con nombres diferentes: setRadius(float r) y SetPoint(float x, float y. ), pero sólo basta con establecer un nombre de función CSetCicle. En este ejemplo simple, la sobrecarga no tiene ninguna ventaja obvia, pero cuando hay docenas o cientos de funciones funcionales similares en una clase, las ventajas de la sobrecarga se vuelven evidentes. En este momento, los programadores no necesitan recordar una variedad tan amplia de nombres de funciones. le permite centrarse más en el programa en sí. Los métodos sobrecargados sólo pertenecen a subclases.
Función:
1. El nombre de la función debe ser el mismo, el valor de retorno puede ser igual o diferente, pero las características deben ser diferentes. Es el nombre de la función lo que determina la diferencia entre las funciones, y es la característica de que la función puede sobrecargarse. El compilador primero selecciona el nombre de la función y luego encuentra la apropiada entre muchas funciones sobrecargadas según las características.
2. Al hacer coincidir funciones, el compilador no distinguirá entre referencias de tipos y tipos en sí, ni entre variables constantes y no constantes. (Pequeña nota: dado que pueden ser diferentes cuando se definen y declaran, pero serán iguales cuando se llamen, el compilador no podrá notar la diferencia). Sin embargo, vale la pena señalar que la equivalencia de parámetros formales con parámetros constantes solo se aplica a parámetros que no son de referencia. Las funciones con parámetros de referencia constantes son diferentes de las funciones con parámetros de referencia no constantes. De manera similar, una función que toma un parámetro de puntero a un tipo constante no es lo mismo que una función que toma un parámetro de puntero a un objeto no constante del mismo tipo.
3. Decoración del nombre. El compilador cifrará cada nombre de función según los parámetros formales especificados en el prototipo.
Redefinición:
La función sobrecargada tiene diferentes versiones. El estado de estas funciones es el mismo. Se pueden seleccionar diferentes funciones según diferentes características. Las funciones redefinidas también tienen diferentes versiones, pero no se puede elegir a voluntad. Solo se puede elegir la última versión. La redefinición ocurre principalmente en herencia entre clases.
4. Hay tantas versiones de la función, entonces, ¿cuál se seleccionará para la compilación?
Por supuesto, lo ideal es que los tipos de datos de los parámetros reales y formales coincidan exactamente, pero ¿qué sucede cuando no coinciden exactamente? Esto implica una conversión de tipos compleja en C++.
En la sobrecarga y la sobrecarga de plantillas de funciones, el compilador selecciona una función y sigue los siguientes tres pasos. Este proceso se denomina resolución de sobrecarga.
Paso uno: cree una lista de funciones candidatas, que contenga funciones y funciones de plantilla con el mismo nombre que la función llamada.
Paso 2: Utilice la lista de funciones candidatas para crear una lista de funciones factibles. Estas son funciones con el número correcto de argumentos.
Paso 3: Determinar si existe la mejor función factible. Si está disponible, úselo.
Para determinar la mejor función solo considera sus características y no el tipo de retorno (no hay manera de considerarlo, pero si hay que buscar una manera, hay una manera, pero no es necesario) desperdiciar recursos para un rendimiento innecesario). Para determinar la mejor función, las características coincidentes deben juzgarse en orden: (1) Coincidencia completa (las funciones regulares son mejores que las plantillas; se permiten conversiones insignificantes) (2) Coincidencia mejorada (como char y short se convierten automáticamente a int) (3) Conversión estándar (int a char, long a double) (4) Conversión definida por el usuario (como la función de conversión definida en la declaración de clase).
Se permiten completamente conversiones irrelevantes, incluidas referencias, entre punteros y entidades, entre matrices y punteros, entre funciones y punteros de función, constantes y no constantes, etc.
En segundo lugar, preste atención a la prioridad de coincidencia. 1. Los punteros y las referencias que apuntan a datos no constantes tienen prioridad sobre los punteros constantes y los parámetros de referencia (esta prioridad solo ocurre cuando aparecen punteros o referencias). 2. Las funciones que no son de plantilla son mejores que las funciones de plantilla. Las plantillas incorporadas explícitamente serán mejores que las plantillas incorporadas implícitamente. En resumen, las más específicas tienen prioridad (tenga en cuenta que la especificidad no está determinada por lo explícito y lo implícito). " se refiere a El compilador realiza la menor cantidad de conversiones al inferir qué tipo usar). Por lo general, una clase derivada hereda los métodos de la clase base. Por lo tanto, al llamar al método de herencia del objeto, se llama y ejecuta la implementación de la clase base. Sin embargo, a veces es necesario tener diferentes implementaciones de los métodos heredados en la clase derivada. class.
Por ejemplo, supongamos que la clase animal tiene un método de carrera, y los caballos y los perros se derivan de ella. Las formas de carrera de los caballos y los perros son diferentes, por lo que el mismo método requiere dos implementaciones diferentes. lo que requiere reescribir el método de la clase base.
Anular el método de la clase base es modificar su implementación o reescribir //el código java en la clase derivada//Método de reescritura public?class?Father{public?void ?ovel(int ?i){/*hacer?algo...*/}public?String?ovef(){/*hacer?algo...*/return?***;}}public?clase?Son ?extiende?Padre {public?void?ovel(int?i){/*hacer?otro?algo...*/}public?String?ovef(){/*hacer?otro?algo...*/return ?XXX;} }