Sobrecarga de funções
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy. Lição 57 de 104.
Sobrecarga de funções permite definir várias funções com o mesmo nome, mas com listas de parâmetros diferentes. O compilador seleciona a versão correta com base nos argumentos que você passa. Essa é uma forma importante de polimorfismo em tempo de compilação.
Para que a sobrecarga funcione, as funções devem diferir em sua assinatura — no número de parâmetros, em seus tipos ou em 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); // Chama add(int, int)
calc.add(2.5, 3.7); // Chama add(double, double)
calc.add(1, 2, 3); // Chama add(int, int, int)O compilador examina cada chamada e a corresponde à sobrecarga apropriada. Isso acontece inteiramente em tempo de compilação, portanto não há sobrecarga em tempo de execução.
Importante: Apenas o tipo de retorno não distingue funções sobrecarregadas. O seguinte causaria um erro de compilação:
int getValue();
double getValue(); // Erro: não é possível sobrecarregar apenas pelo tipo de retornoA sobrecarga de funções torna seu código mais intuitivo. Em vez de criar nomes separados como addInts, addDoubles e addThreeInts, você usa um único nome significativo e deixa o compilador cuidar do restante.
Desafio
FácilVamos criar uma classe formatadora de mensagens que demonstra o poder da sobrecarga de funções. Você criará uma classe Formatter com vários métodos format() que lidam com diferentes tipos de entrada, permitindo que o compilador escolha a versão correta com base no que você passar.
Você organizará seu código em dois arquivos:
Formatter.h: Defina uma classeFormattercom métodosformat()sobrecarregados que lidam com diferentes cenários:- Um método que recebe uma única
std::stringe imprime:Message: <text> - Um método que recebe uma
std::stringe um nível de prioridadeint, imprimindo:[Priority <priority>] <text> - Um método que recebe uma
std::stringe um timestampdouble, imprimindo:[<timestamp>s] <text> - Um método que recebe três parâmetros
std::string(remetente, destinatário, mensagem) e imprime:From <sender> to <receiver>: <message>
format(): o compilador selecionará o método correto com base nos argumentos.- Um método que recebe uma única
main.cpp: Leia quatro entradas (cada uma em uma linha separada):- Um texto de mensagem simples
- Um nível de prioridade (inteiro)
- Um timestamp (double)
- Um nome de remetente
Crie um objeto
Formattere demonstre todos os quatro métodos sobrecarregados:- Chame
format()apenas com o texto da mensagem - Chame
format()com o texto da mensagem e a prioridade - Chame
format()com o texto da mensagem e o timestamp - Chame
format()com o remetente, "Admin" como destinatário e o texto da mensagem
Por exemplo, com as entradas System ready, 3, 12.5 e Server:
Message: System ready
[Priority 3] System ready
[12.5s] System ready
From Server to Admin: System readyObserve como você chama o mesmo nome de método format() quatro vezes, mas cada chamada invoca uma versão diferente com base nos tipos e na quantidade de argumentos. Isso é o polimorfismo em tempo de compilação em ação: o compilador determina qual sobrecarga usar antes mesmo de o programa ser executado.
Experimente você mesmo
#include <iostream>
#include <string>
#include "Formatter.h"
using namespace std;
int main() {
// Ler entradas
string message;
getline(cin, message);
int priority;
cin >> priority;
double timestamp;
cin >> timestamp;
cin.ignore();
string sender;
getline(cin, sender);
// TODO: Criar um objeto Formatter
// TODO: Chamar format() apenas com o texto da mensagem
// TODO: Chamar format() com o texto da mensagem e priority
// TODO: Chamar format() com o texto da mensagem e timestamp
// TODO: Chamar format() com sender, "Admin" como receptor, e o texto da mensagem
return 0;
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos externosBuild e compilação em C++Arquivos de cabeçalho e arquivos-fonteNamespaces e escopoIntrodução à POO em C++Classes vs. objetosO ponteiro 'this'Métodos (funções membro)Atributos (membros de dados)Noções básicas de construtores e destruidoresRevisão - calculadora simples4Propriedades de Classe
Membros de Instância vs. EstáticosGetters e SettersFunções Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRevisão - Gerenciador de Contas Bancárias7Herança
Herança básicaNíveis de acesso da herançaOrdem de chamada de construtor e destrutorSobrescrita de métodosFunções virtuais e VTableHerança múltiplaHerança virtualRevisão - Hierarquia de funcionários10Visão geral da STL
Visão geral e filosofia da STLContêineres da STLIteradoresAlgoritmos da STLFunctors e expressões lambdaRecapitulação - Frequência de palavras13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonFactory e Abstract FactoryPadrão BuilderPadrão ObserverPadrão Strategy2Gerenciamento de Memória
Memória Stack vs. HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Ponteiros Inteligentes em C++RAII em C++Revisão - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de acesso em C++Especificadores de acesso em profundidadeOcultação de informaçõesStruct vs ClasseClasses aninhadas e internasRecapitulação - Sistema de registros de alunos8Polimorfismo
Polimorfismo em compilação vs. execuçãoSobrecarga de funçõesFunções virtuais revisadasFunções virtuais purasClasses abstratasDesign de interfaces em C++Conversão dinâmica e RTTIRecapitulação — Calculadora de formas11Conceitos Avançados de OOP
Composição vs. HerançaMixins via CRTPIdioma PimplApagamento de TiposClasses Enum e Tipagem ForteTratamento de Exceções em OOPHierarquias de Exceções Personalizadas14Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositeRAII como Padrão3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentoListas de Inicialização do ConstrutorConstrutores DelegantesAprofundamento em DestrutoresRegra dos Três / Cinco / ZeroRevisão - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de FluxoSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçõesTemplates de ClassesEspecialização de TemplatesTemplates VariádicosNoções Básicas de SFINAE e Traits de TiposRecapitulação - Contêiner GenéricoPratique por conta própria: Compilador de C++ online