Przeciążanie funkcji jest cechą wielu języków programowania, w której można utworzyć wiele metod o tej samej nazwie, ale z różnymi parametrami wejściowymi lub typami zwracanymi. Jest to powszechna cecha programowania obiektowego; w szczególności konstruktorzy mogą mieć wiele różnych przeciążonych wariantów. Zasadniczo przeciążanie funkcji jest przydatne, gdy dwie funkcje wykonują bardzo podobne rzeczy i mogą wymagać wielu typów danych wejściowych. Konstruktory można łatwo przeciążyć, ponieważ nie mają określonego jawnego typu zwracanego, więc zwykła zmiana parametrów wejściowych konstruktora byłaby prawidłowym przeciążeniem.
Pierwszym sposobem na przeciążenie funkcji jest zmiana jej parametrów wejściowych. Na przykład można rozważyć funkcję o nazwie „dodaj”, która przyjmuje jako dane wejściowe dwie liczby całkowite. Cel tej funkcji jest dość oczywisty; ma na celu znalezienie sumy dwóch liczb całkowitych.
Jeśli jednak ktoś chciałby znaleźć sumę dwóch liczb zmiennoprzecinkowych lub liczb dziesiętnych, ta funkcja nie miałaby zastosowania. Tak więc potrzebna byłaby druga przeciążona funkcja, zdefiniowana jako funkcja o nazwie „dodaj”, która przyjmuje jako dane wejściowe dwa zmiennoprzecinkowe. Funkcje robią zasadniczo to samo, ale przeciążanie funkcji jest konieczne, ponieważ ich dane wejściowe są znacząco różne.
Drugim sposobem na przeciążenie funkcji jest zmiana zarówno jej parametrów wejściowych, jak i typu zwracanego. Korzystając z poprzedniego przykładu, można rozważyć, czy obie przeciążone funkcje „dodaj” miały zwracany typ void; to znaczy, że nic nie zwrócili. Byłoby to nadal prawidłowe przeciążanie funkcji, ale typy zwracane przez dwie metody mogą również zostać zmienione. W innym prawidłowym przypadku przeciążenia funkcja „dodaj”, która przyjmuje dwie liczby całkowite, może zwrócić tę sumę liczb całkowitych, a funkcja „dodaj”, która przyjmuje dwie liczby dziesiętne, może zwrócić tę sumę liczb dziesiętnych.
Jednak zwykła zmiana zwracanego typu funkcji nie jest uważana za prawidłowe przeciążanie funkcji. Zmiana tylko typu zwracanego funkcji powoduje niejednoznaczność, ponieważ z sygnatury metody nie wynika jasno, który typ zwracany jest pożądany. Parametry można również definiować niejednoznacznie, dlatego bardzo ważne jest, aby przeciążone funkcje były poprawnie wywoływane. Na przykład, jeśli jedna ma przeciążoną funkcję, której parametrem wejściowym jest liczba całkowita, a druga, która ma jako parametr liczbę dziesiętną, bardzo łatwo byłoby komuś przypadkowo wywołać funkcję liczb dziesiętnych zamiast funkcji liczb całkowitych lub odwrotnie, ponieważ mają taką samą nazwę. W miarę możliwości należy unikać takich niejednoznacznych parametrów, a jeśli nie jest to możliwe, należy zadbać o to, aby właściwa przeciążona funkcja była wywoływana we właściwym czasie.
Przeciążanie funkcji jest przydatne do tworzenia powiązanych funkcji z różnymi typami danych wejściowych i zapewnia kodowi dużą elastyczność. Ostatnią kwestią dotyczącą przeciążonych funkcji jest to, że niezbędne jest odpowiednie komentowanie. Chociaż dzięki różnym parametrom wejściowym może być jasne, która wersja przeciążonej funkcji jest odpowiednia dla określonej sytuacji, nie zawsze może być jasne, co funkcja robi inaczej niż jej inni przeciążeni partnerzy.