Preopterećenje funkcije značajka je mnogih programskih jezika gdje se može kreirati više metoda s istim imenom, ali s različitim ulaznim parametrima ili vrstama povrata. Ovo je uobičajena značajka u objektno orijentiranom programiranju; konstruktori posebno mogu imati više različitih preopterećenih varijanti. U suštini, preopterećenje funkcija je korisno kada dvije funkcije rade vrlo slične stvari i mogu zahtijevati više vrsta unosa za to. Konstruktori se mogu lako preopteretiti jer nemaju specificiran eksplicitni tip povrata, tako da bi jednostavna promjena ulaznih parametara konstruktora bila valjano preopterećenje.
Prvi način na koji se funkcija može preopteretiti je promjena njezinih ulaznih parametara. Na primjer, može se uzeti u obzir funkcija pod nazivom “add” koja uzima kao svoj ulaz dva cijela broja. Svrha ove funkcije je prilično očita; namijenjeno je pronalaženju zbroja dva cijela broja.
Međutim, ako se želi pronaći zbroj dvaju float-a ili decimalnih brojeva, ova funkcija ne bi bila primjenjiva. Dakle, bila bi neophodna druga preopterećena funkcija, definirana kao funkcija koja se zove “add” koja kao svoj ulaz uzima dva floata. Funkcije u osnovi rade istu stvar, ali je preopterećenje funkcija neophodno jer se njihovi ulazi značajno razlikuju.
Drugi način na koji se funkcija može preopteretiti je promjena i njezinih ulaznih parametara i tipa povrata. Koristeći prethodni primjer, može se razmotriti jesu li obje preopterećene funkcije “dodaj” imale void tip povrata; odnosno ništa nisu vratili. Ovo bi i dalje bilo valjano preopterećenje funkcije, ali bi se također mogli promijeniti tipovi povrata dviju metoda. U drugom važećem slučaju preopterećenja, funkcija “add” koja uzima dva cijela broja mogla bi vratiti taj cijeli zbroj brojeva, a funkcija “add” koja uzima dva decimalna broja mogla bi vratiti taj zbroj decimalnog broja.
Međutim, jednostavno mijenjanje vrste povrata funkcije ne smatra se valjanim preopterećenjem funkcije. Promjena samo povratnog tipa funkcije rezultira dvosmislenošću, jer iz potpisa metode nije jasno koji tip povrata je poželjan. Parametri se također mogu definirati dvosmisleno, pa je vrlo važno da se preopterećene funkcije ispravno pozivaju. Na primjer, ako jedna ima preopterećenu funkciju koja ima cijeli broj kao ulazni parametar, a druga koja ima decimalni broj kao parametar, bilo bi vrlo lako da netko slučajno pozove funkciju decimalnog broja umjesto funkcije cijelog broja , ili obrnuto, jer imaju isti naziv. Dvosmislene parametre kao što su ovi treba izbjegavati ako je moguće, a ako se ne mogu, treba paziti da se ispravna preopterećena funkcija poziva u odgovarajuće vrijeme.
Preopterećenje funkcija korisno je za stvaranje povezanih funkcija s različitim vrstama unosa, a kodu daje veliku fleksibilnost. Posljednje razmatranje o preopterećenim funkcijama je da je adekvatno komentiranje neophodno. Iako bi po različitim ulaznim parametrima moglo biti jasno koja je verzija preopterećene funkcije prikladna za određenu situaciju, možda neće uvijek biti jasno što funkcija radi drugačije od ostalih preopterećenih partnera.