cpp-sobrecarga-funciones

Qué es la sobrecarga de funciones en C++

La sobrecarga de funciones es una característica de C++ que permite definir múltiples versiones de funciones con el mismo nombre pero con diferentes listas de parámetros.

El compilador de C++ decide qué versión de la función invocar basándose en los tipos y número de argumentos que se pasan en la llamada a la función.

Esto proporciona flexibilidad y evita la necesidad de usar nombres de funciones diferentes para operaciones similares.

Sintaxis de la sobrecarga

Para utilizar la sobrecarga de funciones, las funciones deben diferenciarse por al menos un aspecto de sus parámetros: el tipo o el número de argumentos.

#include <iostream>

// Función para sumar dos enteros
int Sumar(int a, int b) {
    return a + b;
}

// Función para sumar tres enteros
int Sumar(int a, int b, int c) {
    return a + b + c;
}

// Función para sumar dos números de punto flotante
double Sumar(double a, double b) {
    return a + b;
}

int main() {
    std::cout << "Suma de 2 y 3: " << Sumar(2, 3) << std::endl;           // Llama a Sumar(int, int)
    std::cout << "Suma de 1, 2 y 3: " << Sumar(1, 2, 3) << std::endl;    // Llama a Sumar(int, int, int)
    std::cout << "Suma de 2.5 y 3.5: " << Sumar(2.5, 3.5) << std::endl;   // Llama a Sumar(double, double)

    return 0;
}

En este ejemplo, la función Sumar está sobrecargada de tres formas:

  • Para sumar dos enteros.
  • Para sumar tres enteros.
  • Para sumar dos números de punto flotante.

No es posible emplear la sobrecarga basada únicamente en el tipo de retorno. Por ejemplo, el siguiente caso no sería valido:

int MiMetodo(int a, int b) {
    return a + b;
}

// Esto no es válido, ya que solo se diferencia por el tipo de retorno
double MiMetodo(int a, int b) {
    return static_cast<double>(a + b);
}

Ejemplos prácticos

Calcular el área de un rectángulo

Puedes sobrecargar una función para calcular el área de un rectángulo en función de diferentes conjuntos de parámetros:

#include <iostream>

// Función para calcular el área de un rectángulo usando longitud y ancho
double CalcularArea(double longitud, double ancho) {
    return longitud * ancho;
}

// Función para calcular el área de un cuadrado usando un solo lado
double CalcularArea(double lado) {
    return lado * lado;
}

int main() {
    double areaRectangulo = CalcularArea(5.0, 3.0); // Llama a CalcularArea(double, double)
    double areaCuadrado = CalcularArea(4.0);        // Llama a CalcularArea(double)

    std::cout << "Área del rectángulo: " << areaRectangulo << std::endl;
    std::cout << "Área del cuadrado: " << areaCuadrado << std::endl;

    return 0;
}

Aquí, CalcularArea se sobrecarga para manejar tanto rectángulos como cuadrados, usando diferentes números de parámetros.

Sobrecarga para sumar números

Otra aplicación común de la sobrecarga es para sumar números de distintos tipos:

#include <iostream>

// Función para sumar dos números enteros
int Sumar(int a, int b) {
    return a + b;
}

// Función para sumar dos números de punto flotante
double Sumar(double a, double b) {
    return a + b;
}

int main() {
    int sumaEnteros = Sumar(3, 5);       // Llama a Sumar(int, int)
    double sumaDecimales = Sumar(3.5, 5.7); // Llama a Sumar(double, double)

    std::cout << "Suma de enteros: " << sumaEnteros << std::endl;
    std::cout << "Suma de decimales: " << sumaDecimales << std::endl;

    return 0;
}

Este código muestra cómo sobrecargar la función Sumar para trabajar con enteros y números decimales, facilitando el uso de la misma función para diferentes tipos de datos.

Imprimir información de un empleado

Puedes sobrecargar una función para imprimir diferentes niveles de información sobre un empleado:

#include <iostream>

// Función para imprimir información básica de un empleado
void ImprimirEmpleado(const std::string& nombre, int edad) {
    std::cout << "Empleado: " << nombre << ", Edad: " << edad << std::endl;
}

// Función para imprimir información completa de un empleado
void ImprimirEmpleado(const std::string& nombre, int edad, const std::string& departamento) {
    std::cout << "Empleado: " << nombre << ", Edad: " << edad << ", Departamento: " << departamento << std::endl;
}

int main() {
    ImprimirEmpleado("Luis", 30);             // Llama a ImprimirEmpleado(const std::string&, int)
    ImprimirEmpleado("María", 25, "Ventas");  // Llama a ImprimirEmpleado(const std::string&, int, const std::string&)

    return 0;
}

En este ejemplo, ImprimirEmpleado está sobrecargada para aceptar dos o tres parámetros, proporcionando flexibilidad para imprimir diferentes niveles de detalle.

Estos ejemplos tienen el propósito de mostrar cómo utilizar la sobrecarga. No significa que sea la mejor forma de resolver el problema que abordan. Lo normal es que haya alternativas mejores