Supraîncărcarea funcțiilor

În anumite situații, când dorim, spre exemplu, să implementăm diferite operații pe mulțimi diferite de numere, este o idee bună să realizăm mai multe funcții cu același nume, destinate abordării separate a fiecărui caz.

Un bun exemplu ar fi adunarea numerelor complexe. Este necesar, în acest caz să tratăm independent fiecare din cazurile: cele două numere sunt reale, unul este real, iar unul este complex, respectiv ambele sunt complexe. Presupunând că, anterior, am definit tipul de date complex ca pe un conglomerat cu câmpurile re și im, o implementare ar putea arăta în acest caz, astfel:

complex suma(float a, float b) { complex c;  c.re=a+b; c.im=0; return c; } complex suma(float a, complex b) { complex c;  c.re=a+b.re; c.im=b.im; return c; } complex suma(complex a, complex b) { complex c;  c.re=a.re+b.re; c.im=a.im+b.im; return c; }

În exemplu sunt trei funcții, numite identic, care au câte doi parametri de diferite tipuri. Astfel, prima are ambii parametri reali, a doua are un parametru real și celălalt complex, iar ultima are ambii parametri complecși. În funcție de parametrii de apel, compilatorul știe pe care dintre cele trei să o instanțieze.

În general, funcțiile pot avea comportamente complet diferite, deși,pentru a păstra coerența codului, este necesar ca funcțiile supraîncărcate să aibă efecte asemănătoare.