En C++, dos o más funciones pueden compartir el mismo nombre, siempre y cuando sus declaraciones de parámetros sean diferentes.
El proceso por el cual varias funciones pueden compartir el mismo nombre se denomina sobrecarga (overload) de funciones. De estas funciones se dice que están sobrecargadas.
El programa 28SOB_FUNC.CPP es un ejemplo de funciones sobrecargadas, que es una de las claves de la programación orientada a objetos.
#include <iostream.h> overload relleno; // Esto es opcional int relleno(const int); // Cuadrado de un número int relleno(float); // Triple de un float y retorna int float relleno(const float, float); // Promedio de dos float main() { int ind = 12; float longitud = 14.33; float altura = 34.33; cout << "El cuadrado de 12 es " << relleno(ind) << "\n"; cout << "El cuadrado de 24 es " << relleno(2 * ind) << "\n"; cout << "El triple de la longitud es " << relleno(longitud) << "\n"; cout << "El triple de la altura es " << relleno(altura) << "\n"; cout << "El promedio es " << relleno(longitud,altura) << "\n"; } {int relleno(const int valor) // Cuadrado de un número return valor * valor; } int relleno(float valor) // Triple de un float y retorna int { return (int)(3.0 * valor); } float relleno(const float in1, float in2) // Promedio de dos float { return (in1 + in2)/2.0; }
En este programa ejemplo hay tres funciones, además de la función principal, y las tres tienen el mismo nombre. La primer pregunta es probablemente «¿ Qué función se ejecutará cuando se llame a relleno () ?» .
La respuesta es que se ejecutará la función que tenga el número correcto de parámetros formales y que sean del tipo especificado.
Si se llama a la función relleno () con una variable o valor entero como su parámetro real, la función comenzará en la línea 22. Si el único parámetro real es de tipo float, la función que comenzará en la línea 27, y si se especifican dos float, la función comenzará en la línea 33.
Es importante destacar que el tipo de regreso no es usado para determinar qué función se llamará. Solamente los parámetros formales se usan para determinarlo.
La palabra clave overload usada en la línea 3 sólo es requerida en la versión 1.2 de C++. La versión 2.0 y posteriores de C++ no la requieren, pero permiten usarla opcionalmente a fin de que el código sea compatible con otros compiladores.
La selección de que función se llamará realmente no resta tiempo de ejecución ni compilación. Si se pusieran nombres diferentes a cada una de las funciones sobrecargadas, no habría ninguna diferencia en la velocidad o tamaño de ejecución del programa resultante.
El uso del operador const en algunas de las cabeceras y prototipos de función impide que el programador cambie accidentalmente el parámetro formal dentro de la función. En funciones tan cortas como éstas no hay problema. En una función más importante que se modifica ocasionalmente, se podría olvidar fácilmente la intención original del uso de un valor e intentar cambiarlo durante la depuración del programa.