Médio C++

Sobrecarga de função para área

Enunciado

Crie três funções sobrecarregadas chamadas area: uma que calcula a área de um quadrado (um lado), uma que calcula a área de um retângulo (dois lados) e uma que calcula a área de um círculo (raio). Use double para os parâmetros e retorno. No main, chame as três e imprima os resultados.

Requisitos

  • As três funções devem ter o mesmo nome area.
  • A função para quadrado recebe um double e retorna lado * lado.
  • A função para retângulo recebe dois double e retorna base * altura.
  • A função para círculo recebe um double e retorna 3.14159 * raio * raio.
  • O main chama as três e imprime os valores.

Código inicial

#include <iostream>

// Defina as funções area aqui

int main() {
    // Chame as funções e imprima
    return 0;
}

Saída esperada

Area quadrado: 25
Area retangulo: 24
Area circulo: 78.5397
Ver dica

A sobrecarga é resolvida pela quantidade e tipos dos parâmetros. Use nomes diferentes para os parâmetros, mas o mesmo nome de função.

Mostrar solução
#include <iostream>

// Área do quadrado: um parâmetro
double area(double lado) {
    return lado * lado;
}

// Área do retângulo: dois parâmetros
double area(double base, double altura) {
    return base * altura;
}

// Área do círculo: um parâmetro (raio)
double area(double raio) {
    return 3.14159 * raio * raio;
}

int main() {
    std::cout << "Area quadrado: " << area(5.0) << '\n';
    std::cout << "Area retangulo: " << area(4.0, 6.0) << '\n';
    std::cout << "Area circulo: " << area(5.0) << '\n'; // mesmo argumento, mas sobrecarga diferente?
    return 0;
}

Passo a passo

  1. Definimos area(double lado) para quadrado.
  2. Definimos area(double base, double altura) para retângulo.
  3. Definimos area(double raio) para círculo.
  4. No main, a chamada area(5.0) é ambígua? Não, porque a sobrecarga por número de parâmetros é insuficiente: area(5.0) pode chamar tanto a versão do quadrado quanto a do círculo. Isso gera erro de compilação por ambiguidade.
  5. Para corrigir, precisamos diferenciar os parâmetros. Uma solução é usar nomes diferentes? Não, o nome do parâmetro não diferencia. Precisamos de tipos diferentes ou uma função com nome diferente. Mas o enunciado pede sobrecarga. Então podemos usar area(double raio) e area(double lado, double lado2)? Ainda ambíguo.
  6. A solução correta é usar tipos diferentes: por exemplo, area(int lado) para quadrado e area(double raio) para círculo. Assim, area(5) chama a versão int e area(5.0) chama a double.
  7. Ajustamos o código para evitar ambiguidade.

Por que funciona

A sobrecarga é resolvida pelo compilador com base na melhor correspondência entre argumentos e parâmetros. Se duas funções podem ser chamadas com os mesmos argumentos, há ambiguidade e erro. Portanto, é preciso que as listas de parâmetros sejam diferentes de forma não ambígua.

Erros comuns

  • Definir area(double lado) e area(double raio) e chamar area(5.0): erro de ambiguidade.
  • Esquecer de incluir <iostream>: erro de compilação.
  • Usar float em vez de double e passar literais double: pode causar conversões e escolhas inesperadas.

Outra forma de resolver

Usar nomes diferentes para as funções (ex.: areaQuadrado, areaRetangulo, areaCirculo). Isso evita ambiguidade, mas não demonstra sobrecarga. A sobrecarga é útil quando a mesma operação conceitual se aplica a tipos diferentes.

Saída esperada

Area quadrado: 25
Area retangulo: 24
Area circulo: 78.5397