Przeciążanie funkcji

Przeciążanie funkcji (ang. overloading) - skrótowa nazwa na przeciążanie nazwy funkcji; w programowaniu występowanie pod taką samą nazwą wielu funkcji różniących się zestawem argumentów. W trakcie kompilacji bądź parsowania program znajduje właściwą funkcję po liczbie oraz typach argumentów. Możliwe jest więc współistnienie kilku funkcji o tej samej nazwie, lecz różniących się typami argumentów.

Przykład w języku Object Pascal

procedure Foo(f: integer); overload;

procedure Foo(s: string; f: integer); overload;

procedure Foo(d: double; f: integer); overload;

Przeciążanie funkcji w języku Object Pascal dostępne jest od środowiska Delphi w wersji 4.

Sytuacje niejednoznaczne i błędy przeciążania

Nie zawsze kompilator jest w stanie odpowiednio odróżnić funkcje o tej samej nazwie, muszą się one od siebie wyraźnie różnić. Czasem zdarzają się też sytuacje, w której dwie funkcje o tej samej nazwie mogą współistnieć, ale dane wywołanie byłoby niejednoznaczne. Problemy są następujące:

  • Jeśli funkcje (jedna lub obie) przyjmują argumenty domyślne, to mogą współistnieć jeśli te "niedomyślne" argumenty mają te same typy, tyle że wywołanie z podaniem wyłącznie wymaganych argumentów będzie wtedy niejednoznaczne (i odrzucone). Najlepiej nie mieszać ze sobą przeciążania i argumentów domyślnych.
  • Podczas wybierania funkcji do wywołania uwzględnia się też domyślne konwersje i trzeba znać ich priorytety; np. jeśli funkcję przeciążymy na typy short i long, to wywołanie z typem float jest niejednoznaczne.
  • Przeciążać można tylko na podstawie typów argumentów (a nie wartości zwracanej).
  • Uzyskanie wskaźnika do przeciążonej funkcji jest niemożliwe. Udaje się to tylko w przypadku wyrażeń, w których oczekuje się konkretnego typu od takiego wyrażenia, np. przypisując do zmiennej typu wskaźnika do funkcji - wtedy zostanie wybrana ta funkcja, która pasuje do sygnatury funkcji, do której jest ten wskaźnik. Nie można jednak takiej funkcji używać jako argumentu do szablonu funkcji - jest to znany problem z używaniem funkcji std::transform wraz z std::tolower.
O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-ShareAlike 3.0 License