Preťažovanie funkcií

Čo to je preťažovanie funkcií

Preťažovanie funkcií Function Overloading spočíva v tom, že môžem jednej a tej istej funkcii nastaviť aby sa správala v závislosti na tom, aké sú jej argumenty. Toto sa dá rozlišovať jednak podľa typu argumentov, a jednak podľa ich počtu. Najjednoduchším príkladom je funkcia absolútnej hodnoty. Ak vstúpi do funkcie celé číslo, vracia funkcia celé kladné číslo, ak vstúpi desatinné číslo funkcia vráti kladné desatinné číslo.
#include "stdio.h"

int AbsValue (int a){
  return( a>0?a:(-a));}

double AbsValue (double a){
  return( a>0?a:(-a));}

int main(int argc, char* argv[])
{

printf("\n%d ",AbsValue (2));
printf("\n%d ",AbsValue (-4));
printf("\n%f ",AbsValue (3.5));
printf("\n%f ",AbsValue (-4.5));
//chybne vypisy
printf("\n%d ",AbsValue (2.4));
printf("\n%d ",AbsValue (-4.4));
printf("\n%f ",AbsValue (2));
printf("\n%f ",AbsValue (-4));

char pause=getchar();

        return 0;
}
Teraz sa funkcia správa podľa toho, čo do nej vstupuje... (aj keď toto nie je najšťastnejší príklad, lebo obe robia to isté :) Je treba si trochu dávať pozor aj čo chem vypisovať, lebo to nemusí fungovať správne, viď príklad... Na prvý pohľad, by sa to dalo riešiť tým, že urobíme nové funkcie s rovnakým menom, ktoré budú vracať aj iné typy (teda funkciu do ktorej vstupuje celé číslo a ona vráti jeho absolútnu hodnotu ako desatinné číslo a naopak...). Toto je však práve to čomu sa treba vyhýbať. Nemožno definovať viacero funkcií s rovnakým názvom a rovnakými vstupnými parametrami, ktoré sa líšia len v návratovej hodnote. Keby sme túto funkciu niekedy volali, prekladač by nevedel, ktorú funkciu to vlastne voláme (nevedel by sa rozhodnúť na základe vstupných parametrov.
#include "stdio.h"

int maximum (int a){
  return(a);   }

int maximum (int a, int b){
  return( a>b?a:b);}

int maximum (int a, int b, int c){
  if ((a>=b)&(a>=c))return a;
  if ((b>=c)&(b>=a))return b;
  if ((c>=a)&(c>=b))return c;
                                }

int main(int argc, char* argv[])
{

printf("\n%d ",maximum (2));
printf("\n%d ",maximum (-5,0));
printf("\n%d ",maximum (-22,44,44));

char pause=getchar();

        return 0;
}
Toto isté samozrejme existuje aj pre rôzny počet premenných, a dá sa to aj kombinovať (teda vytvoriť funkciu, ktorá sa správa v závislosti na type a počte parametrov)
#include "stdio.h"

void printf (int a){
  printf("\n%d",a);   }

void printf (double a){
  printf("\n%f",a);   }

int main(int argc, char* argv[])
{

printf(3);
printf(3.65);

char pause=getchar();

        return 0;
}
Celkom zaujímavé je, že sa dajú preťažovať aj funkcie zo štandardných knižníc... (aj keď je to logické a neexistuje dôvod prečo by to nemalo fungovať...)

(c) Wray 2006