Sobrecarga de função em C++
Este artigo demonstrará vários métodos de uso de sobrecarga de função em C++.
Definir funções sobrecarregadas em C++
A sobrecarga de função é conhecida como uma parte do polimorfismo ad hoc que fornece as funções que podem ser aplicadas a objetos de diferentes tipos. Ou seja, essas funções são definidas com o mesmo nome no escopo fornecido e devem diferir no número ou tipos de argumentos. Observe que as funções sobrecarregadas são apenas um conjunto de funções diferentes que são resolvidas em tempo de compilação. O último recurso os diferencia do polimorfismo de tempo de execução, que é usado para funções virtuais. O compilador observa o tipo dos argumentos e escolhe qual função chamar.
As funções sobrecarregadas devem diferir no tipo de parâmetro ou em vários parâmetros. Caso contrário, ocorrerá o erro do compilador. Mesmo quando o tipo de retorno é diferente entre funções sobrecarregadas ou tipos com alias são usados como argumentos, o compilador falha com um erro. No exemplo a seguir, implementamos uma estrutura Math
que possui três funções estáticas
para soma de números. Cada uma das funções leva diferentes tipos de pares de argumentos e retorna o tipo correspondente. Como resultado, o Math::sum
pode ser invocado com elementos de vetor de um tipo diferente. Observe que, a palavra-chave struct
define uma classe em C++ e seus membros são públicos por padrão.
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
struct Math {
static auto sum(int x, int y) { return x + y; }
static auto sum(float x, float y) { return x + y; }
static auto sum(double x, double y) { return x + y; }
};
int main() {
vector<int> vec1 = {1, 2, 3, 4, 5};
vector<float> vec2 = {1.0, 2.0, 3.0, 4.0, 5.0};
for (const auto &item : vec1) {
cout << Math::sum(item, item * 2) << "; ";
}
cout << endl;
for (const auto &item : vec2) {
cout << Math::sum(item, item * 2) << "; ";
}
cout << endl;
return EXIT_SUCCESS;
}
Resultado:
3; 6; 9; 12; 15;
3; 6; 9; 12; 15;
Use funções sobrecarregadas com modelos em C++
Os modelos são uma forma de programação genérica implementada na linguagem C++. Ele tem recursos semelhantes para sobrecarga de função, já que ambos são inferidos em tempo de compilação. Observe que o fragmento de código a seguir tem a função printExponentVec
que produz os elementos do vetor genérico. Portanto, ele é utilizado para conduzir a mesma operação para cada tipo, mas quando queremos implementar diferentes corpos de função para diferentes tipos, a sobrecarga de função deve ser usada.
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
struct ExponentTwo {
static auto Calc(int n) { return n * n; }
static auto Calc(float n) { return n - n * n; }
static auto Calc(double n) { return n + n * n; }
};
template <typename T>
void printExponentVec(const vector<T> &vec) {
for (auto &i : vec) {
cout << ExponentTwo::Calc(i) << "; ";
}
cout << endl;
}
int main() {
vector<int> vec1 = {1, 2, 3, 4, 5};
vector<float> vec2 = {1.0, 2.0, 3.0, 4.0, 5.0};
printExponentVec(vec1);
printExponentVec(vec2);
return EXIT_SUCCESS;
}
Resultado:
1; 4; 9; 16; 25;
0; -2; -6; -12; -20;
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook