#include <iostream.h>
void show(int val)
{
cout <<" Es un entero :"<< val << '\n';
}
void show(char *val)
{
cout <<"Es un carácter: "<< val << '\n';
}
main()
{
show (42);
show ("A");
show (452.2);
}
En la primera llamada a la función show, se le pasa un entero,
por tanto se llama a la primera copia de la función show. La
segunda vez, el argumento es un carácter, por tanto se utiliza la segunda
definición, aquella que utiliza un carácter. Ahora bien, la tercera llamada
utiliza un número real, y no existe una definición de la función para este caso.
El compilador utiliza la primer definición. La salida del programa es:
Es un entero :42 Es un carácter: A Es un entero :452
También podríamos haber convertido la variable con la que llamamos a la
función a uno de los tipos para los cual show está definida. Por
ejemplo, si sustituimos la tercera llamada del programa anterior por:
show ((int)452.2);la salida será:
Es un entero: 42 Es un carácter: A Es un entero : 452
Es interesante destacar que la forma en que el compilador de C++ implementa
la sobrecarga de funciones es bastante simple. Aunque las funciones compartan el
mismo nombre en el texto fuente, el compilador usa nombres diferentes. La
conversión de un nombre en el fichero fuente al nombre usado internamente se
llama 'name mangling'. Por ejemplo, el compilado de C++ convertirá el nombre
void show(int) al nombre interno VshowI, mientras que
una función análoga con un argumento char* será llamada
VshowCP . Los nombres reales utilizados internamente dependen del
compilador y no son relevantes para el programador.
Algunos comentarios sobre la sobrecarga de funciones:
show (0);dadas las funciones anteriores show() anteriores. El cero puede ser interpretado como un puntero NULL a un carácter o como un entero con el valor 0. C++ elegirá llamar a la función que espera un argumento entero, que puede no ser lo que se esperaba.