next up previous contents
Next: Surcharge et portée Up: No Title Previous: Liaison dynamique et héritage

Surcharge

On a surcharge (overloading) d'un nom de fonction quand le même nom peut être utilisé pour désigner plusieurs fonctions. Pour un nom surchargé, le type (statique) des arguments permettra de déterminer la fonction. La surcharge est un mécanisme présent dans la plupart de langages de programmation.

En C, par exemple, le '/' opérateur de division est surchargé : suivant le type des paramètres il s'agira soit de la division entière soit de la division réelle. En C++, (comme aussi en ADA) l'utilisateur peut surcharger des fonctions, mais aussi des opérateurs du langage. Dans ce dernier cas, les règles de priorité et d'association des opérateurs seront conservées.

La surcharge est un autre mécanisme qui permet une sorte de polymorphisme : un même nom a plusieurs significations. En C++, un nom de fonction sera surchargé s'il existe plusieurs déclarations accessibles dans la même portée pour ce nom. Dans ce cas, la fonction sera choisie en comparant les types des paramètres réels aux types des paramètres formels des déclarations accessibles. Les règles qui déterminent la surcharge seront précisées plus loin.

Il s'agit d'un mécanisme distinct de la liaison dynamique, ici tout est réglé à la compilation par le compilateur, il s'agit d'un mécanisme purement syntaxique. Étant donnée une occurrence du nom de fonction dans le texte du programme, le compilateur connaissant toutes les déclarations dans la portée de ce nom, connaissant aussi les types des arguments qui sont statiquement déterminés, peut résoudre l'association entre le nom et la bonne fonction. Il s'agit en fait simplement d'une facilité d'écriture.

Bien entendu, la surcharge doit être sans ambiguïté : il faut qu'à toute occurrence d'un nom le compilateur puisse associer une seule fonction. Du fait de la possibilité des conversions standard ou celles définies par l'utilisateur, le problème n'est pas si simple...

Exemple:

double carre(double);
int carre(int);

carre(1);   // appel de carre(int)
carre(1.0); // appel de carre(double)

On n'a pas besoin d'utiliser de conversions, mais que se passerait-il pour carre((unsigned long)2)?




next up previous contents
Next: Surcharge et portée Up: No Title Previous: Liaison dynamique et héritage


Mon Oct 20 14:02:48 MET 1997