Además, estudiamos la diferencia entre la sobrecarga y la anulación con la ayuda de un cuadro comparativo.
Gráfica comparativa:
Bases para la comparación | Sobrecarga | Primordial |
---|---|---|
Prototipo | El prototipo difiere, ya que el número o el tipo de parámetro pueden diferir. | Todos los aspectos del prototipo deben ser iguales. |
Palabra clave | Ninguna palabra clave aplicada durante la sobrecarga. | La función que se debe anular está precedida por la palabra clave 'virtual', en la clase base. |
Factor diferenciador | El número o tipo de parámetro difiere, lo que determina la versión de la función que se está llamando. | La función de la clase a la que llama el puntero está determinada por la dirección de la clase de objeto que se asigna a ese puntero. |
Definiendo patron | Las funciones se redefinen con el mismo nombre, pero con diferente número y tipo de parámetro. | La función está definida, precedida por una palabra clave 'virtual' en la clase principal y redefinida por una clase derivada sin palabra clave. |
Tiempo de logro | Tiempo de compilación. | Tiempo de ejecución |
Constructor / función virtual | Los constructores pueden estar sobrecargados. | La función virtual puede ser anulada. |
Incinerador de basuras | Destructor no puede ser sobrecargado. | Destructor puede ser anulado. |
Unión | La sobrecarga logra una unión temprana. | Anular se refiere a la vinculación tardía. |
Definición de sobrecarga
El polimorfismo en tiempo de compilación se llama "sobrecarga". Como la sobrecarga se genera a partir de un concepto de polimorfismo, proporciona "una interfaz común para múltiples métodos". Eso significa que, si una función está sobrecargada, contiene el mismo nombre de función mientras se redefine.
Las funciones sobrecargadas difieren en cuanto a "número o tipo de parámetro (s) diferente", hace que una función sobrecargada sea distinta de otra. De esta manera, el compilador reconoce a qué función sobrecargada se está llamando. Las funciones más comúnmente sobrecargadas son "constructores". "Copiar constructor" es un tipo de "sobrecarga de constructores".
Implementación de sobrecarga en C ++.
sobrecarga de clase {int a, b; public: int load (int x) {// primera función load () a = x; devuelve un } int load (int x, int y) {// segunda función load () a = x; b = y; devuelve a * b; }}; int main () {sobrecarga O1; O1.load (20); // primera función load () llamada O1.load (20, 40); // segunda llamada a la función load ()}
Aquí la función load () de la sobrecarga de clase ha sido sobrecargada. Las dos funciones sobrecargadas de la clase se pueden distinguir de una manera en que la primera función load () acepta solo un parámetro entero entero, mientras que la segunda función load () acepta dos parámetros integer. Cuando el objeto de la sobrecarga de clase llama a la función load () con un solo parámetro, se llama a la primera función load (). Cuando el objeto llama a la función load () pasando dos parámetros, se llama a la segunda función load ().
Definición de anulación
El polimorfismo logrado durante el tiempo de ejecución se llama "anulación". Se logra mediante el uso de 'herencia' y 'funciones virtuales'. La función que se va a anular está precedida por la palabra clave 'virtual' en una clase base y se redefine en una clase derivada sin ninguna palabra clave.
Una de las cosas más importantes que se deben recordar en caso de anulación es que el prototipo de la función anulada no debe cambiar, mientras que la clase derivada la redefine. Cuando una función anulada recibe una llamada, C ++ determina a qué versión de la función se llama en función del 'tipo de objeto apuntado por un puntero' mediante el cual se realiza la llamada de la función.
Implementación de Overriding en C ++
class base {public: virtual void funct () {// virtual function of base class cout << "Este es el funct de una clase base ()"; }}; class Derivada1: base pública {public: void funct () {// función virtual de la clase base redefinida en derivada clase1 cout << "Esta es la funct () de una clase derivada1)"; }}; class Derivada2: base pública {public: void funct () {// función virtual de la clase base redefinida en derivada2 clase coutfunct (); // llamar a la clase derivada1 funct (). * p = & d2; p-> funct (); // llamar a la clase derivada2 funct (). devuelve 0; }
Aquí, hay una única clase base que se hereda públicamente por dos clases derivadas. Una función virtual se define en una clase base con una palabra clave 'virtual', y se redefine mediante las dos clases derivadas sin palabra clave. En main (), la clase base crea una variable de puntero 'p' y un objeto 'b'; 'Derivado1' clase crea un objeto d1 y Derivado clase crea un objeto d2 '.
Ahora, inicialmente, la dirección del objeto 'b' de la clase base se asigna al puntero de la clase base 'p'. 'p' realiza una llamada a la función funct (), por lo que se llama a una función de la clase base. Luego, la dirección del objeto de clase derivada1 'd1' se asigna al puntero 'p', nuevamente da call a funct (); Aquí se ejecuta la función funct () de la clase Derivada1. Finalmente, el puntero 'p' se asigna al objeto de la clase deriva2. Luego, 'p' llama a la función funct () que ejecuta la función func () de la clase derivada2.
Si la clase derivada1 / derivada2 no redefiniera funct (), entonces se habría llamado a la función funt () de la clase base, ya que la función virtual es 'jerárquica'.
Diferencias clave entre sobrecarga y anulación
- El prototipo de una función que se está sobrecargando difiere debido al tipo y número de parámetros que se pasan a la función sobrecargada. Por otro lado, el prototipo de la función anulada no cambia porque una función anulada realiza una acción diferente para la clase diferente a la que pertenece pero con el mismo tipo y número de parámetro.
- El nombre de la función sobrecargada no precede a ninguna palabra clave, mientras que el nombre de una función sobrescrita precede con la clave "Virtual" en la clase base solamente.
- La función sobrecargada que se invoca depende del tipo o número de parámetro que se pasa a la función. La función anulada de qué clase se invoca depende de qué dirección de objeto de la clase se asigna al puntero, que invocó la función.
- La función sobrecargada que se va a invocar se resuelve durante el tiempo de compilación. La función anulada que se invoca se resuelve durante el tiempo de ejecución.
- Los constructores se pueden sobrecargar pero no se pueden anular.
- Los destructores no pueden ser sobrecargados, pero pueden ser anulados.
- La sobrecarga logra un enlace temprano, ya que la función sobrecargada que se invoca se resuelve durante el tiempo de compilación. La anulación logra un enlace tardío, ya que la función invocada que se invocará se resuelve durante el tiempo de ejecución.
Similitudes
- Ambos se aplican a las funciones miembro de una clase.
- El polimorfismo es el concepto básico detrás de ambos.
- El nombre de la función sigue siendo el mismo mientras aplicamos la sobrecarga y la anulación de las funciones.
Conclusión
La sobrecarga y la anulación parecen similares, pero este no es el caso. Las funciones pueden estar sobrecargadas, pero cualquier clase no puede redefinir aún más la función sobrecargada en el futuro. Una función virtual no puede ser sobrecargada; sólo pueden ser anulados.