Menu
Coddy logo textTech

Sobrecarga de funciones

Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy. Lección 57 de 104.

Sobrecarga de funciones te permite definir varias funciones con el mismo nombre, pero con diferentes listas de parámetros. El compilador selecciona la versión correcta según los argumentos que pases. Esta es una forma clave de polimorfismo en tiempo de compilación.

Para que la sobrecarga funcione, las funciones deben diferir en su firma: en el número de parámetros, en sus tipos o en ambos:

class Calculator {
public:
    int add(int a, int b) {
        return a + b;
    }
    
    double add(double a, double b) {
        return a + b;
    }
    
    int add(int a, int b, int c) {
        return a + b + c;
    }
};

Calculator calc;
calc.add(5, 3);        // Llama a add(int, int)
calc.add(2.5, 3.7);    // Llama a add(double, double)
calc.add(1, 2, 3);     // Llama a add(int, int, int)

El compilador examina cada llamada y la vincula con la sobrecarga adecuada. Esto ocurre completamente en tiempo de compilación, por lo que no hay sobrecarga en tiempo de ejecución.

Importante: El tipo de retorno por sí solo no distingue las funciones sobrecargadas. Lo siguiente provocaría un error del compilador:

int getValue();
double getValue();  // Error: no se puede sobrecargar solo por el tipo de retorno

La sobrecarga de funciones hace que tu código sea más intuitivo. En lugar de crear nombres separados como addInts, addDoubles y addThreeInts, usas un único nombre significativo y dejas que el compilador se encargue del resto.

challenge icon

Desafío

Fácil

Construyamos una clase formateadora de mensajes que demuestre el poder de la sobrecarga de funciones. Crearás una clase Formatter con varios métodos format() que gestionen distintos tipos de entrada, permitiendo que el compilador elija la versión correcta según lo que le pases.

Organizarás tu código en dos archivos:

  • Formatter.h: Define una clase Formatter con métodos format() sobrecargados que gestionen distintos escenarios:
    • Un método que reciba un único std::string e imprima: Message: <text>
    • Un método que reciba un std::string y un nivel de prioridad int, e imprima: [Priority <priority>] <text>
    • Un método que reciba un std::string y una marca de tiempo double, e imprima: [<timestamp>s] <text>
    • Un método que reciba tres parámetros std::string (remitente, destinatario, mensaje) e imprima: From <sender> to <receiver>: <message>
    Todos los métodos deben llamarse format(): el compilador seleccionará el correcto según los argumentos.
  • main.cpp: Lee cuatro entradas (cada una en una línea separada):
    1. Un texto de mensaje simple
    2. Un nivel de prioridad (entero)
    3. Una marca de tiempo (double)
    4. Un nombre de remitente

    Crea un objeto Formatter y demuestra los cuatro métodos sobrecargados:

    • Llama a format() solo con el texto del mensaje
    • Llama a format() con el texto del mensaje y la prioridad
    • Llama a format() con el texto del mensaje y la marca de tiempo
    • Llama a format() con el remitente, "Admin" como destinatario y el texto del mensaje

Por ejemplo, con las entradas System ready, 3, 12.5 y Server:

Message: System ready
[Priority 3] System ready
[12.5s] System ready
From Server to Admin: System ready

Observa cómo llamas al mismo nombre de método format() cuatro veces, pero cada llamada invoca una versión diferente según el tipo y la cantidad de argumentos. Esto es polimorfismo en tiempo de compilación en acción: el compilador determina qué sobrecarga usar antes incluso de que se ejecute el programa.

Pruébalo tú mismo

#include <iostream>
#include <string>
#include "Formatter.h"

using namespace std;

int main() {
    // Leer entradas
    string message;
    getline(cin, message);
    
    int priority;
    cin >> priority;
    
    double timestamp;
    cin >> timestamp;
    cin.ignore();
    
    string sender;
    getline(cin, sender);
    
    // TODO: Crear un objeto Formatter
    
    // TODO: Llamar a format() solo con el texto del mensaje
    
    // TODO: Llamar a format() con el texto del mensaje y priority
    
    // TODO: Llamar a format() con el texto del mensaje y timestamp
    
    // TODO: Llamar a format() con sender, "Admin" como receptor, y el texto del mensaje
    
    return 0;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C++ online