#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.