mardi 19 juillet 2016

C++ - cours n°6 -> Surdéfinition ou surcharge de fonction

Surcharge d'une fonction

Pré-Requis

- Les fonctions en C

Problématique

Imaginons que l'on souhaite créer une fonction permettant de multiplier par 2 quelque soit le type d'argument,

[S]Par exemple si on a[/S]:

Un entier comme le nombre 5, on aura 5x2=10
Un flottant comme le nombre 5.7, on aura 5.7x2=11.4
Une chaîne de caractères comme "ab", on aura "ab"x2="abab"

Cette fonction dans un langage de script comme python par exemple est enfantin,

Code:

def mult_2(obj):
    return obj * 2

[S]Résultat[/S]

Code:

>>> def mult_2(obj):
...    return obj * 2
...
>>> mult_2(5)
10
>>> mult_2(5.7)
11.4
>>> mult_2("ab")
'abab'
>>>

Simple non? Eh bien en C++, ce n'est pas possible de faire de la sorte, le langage est dit fortement typé, par définition, il a besoin de connaître le type d'argument de la fonction et son retour, sans ça, c'est niet... Il faudra pour cela surcharger une fonction.

Comment faire en C++ ?

Eh bien on va créer 3 fonctions avec le même nom mais avec un type d'argument différent et un type de retour de fonction différent.

Là pour le test, on va faire simple, ça doit concrètement ressembler à cela

Code:

#include <iostream>

using namespace std;

int mult_2(int obj);
double mult_2(double obj);
string mult_2(string obj);

int main(){

    int a = 5;
    double b = 5.7;
    string c = "ab";

    cout << mult_2(a) << endl;
    cout << mult_2(b) << endl;
    cout << mult_2(c) << endl;

    return 0;
}

Pour la fonction mult_2 retournant un type int et double, ça doit pas poser de problème

Code:

int mult_2(int obj) { return obj * 2; }

double mult_2(double obj) { return obj * 2; }

Remarquez une autre façon d'écrire une fonction ;)

On aurait pu l'écrire d'une façon standard évidemment.

Code:

int mult_2(int obj){
    return obj * 2
}

Bref cette manière est souhaitable, il est rare de n'avoir qu'une seule ligne à écrire dans une fonction...

Revenons à notre problème, où il faut faire cette fonction avec un type string, ça donnerait logiquement,

Code:

string mult_2(string obj) { return obj * 2; }
Eh bien... c'est loupé, vous aurez droit à une erreur sur cette ligne. Pour résoudre c'est une petite astuce, il suffit de concaténer la chaîne une fois,

Code:

string mult_2(string obj) { return obj + obj; }
Voilà nous avons résolu notre problème ! Le code fini est donc celui ci-dessous,

Code:

#include <iostream>

using namespace std;

int mult_2(int obj);
double mult_2(double obj);
string mult_2(string obj);

int main(){

    int a = 5;
    double b = 5.7;
    string c = "ab";

    cout << mult_2(a) << endl;
    cout << mult_2(b) << endl;
    cout << mult_2(c) << endl;

    return 0;
}

int mult_2(int obj){ return obj * 2; }

double mult_2(double obj) { return obj * 2; }

string mult_2(string obj) { return obj + obj; }

[S]Avec le résultat suivant[/S]:

Citation:

10
11.4
abab
On pourrait aussi définir la même fonction mais avec un nombre de paramètres différents

Code:

int mult_2(int obj_1, int obj_2){ return obj_1 + obj_2; }
avec une exécution du style

Code:

cout << mult_2(a, b) << endl;
Nous verrons que certaines fois ce genre de problème peut être résolue plus simplement avec les patrons (template), mais cela sera un autre cours ;)


from Hackademics : Forum de hacking – hackers white hat – cours de securite informatique, apprendre langage python, tutoriels de reverse engineering http://ift.tt/2ar75EE
via IFTTT

Aucun commentaire:

Enregistrer un commentaire