Polymorphisme

1,226 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,226
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
24
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Polymorphisme

  1. 1. Polymorphisme Dynamique et StatiqueRéaliser Par : HERAGUEMI KAMEL EDDINE 1
  2. 2. Définition du polymorphisme Le nom de polymorphisme vient du grec et signifie qui peut prendreplusieurs formes. Cette caractéristique est un des concepts essentiels de laprogrammation orientée objet. Alors que lhéritage concerne les classes(et leur hiérarchie), le polymorphisme est relatif aux méthodes des objets.On distingue généralement trois types de polymorphisme :• Le polymorphisme ad hoc (également surcharge ou en anglais overloading) ,• Le polymorphisme paramétrique (également généricité ou en anglais template) ,• Le polymorphisme dhéritage (également redéfinition, spécialisation ou en anglais overriding) . 2
  3. 3. Le polymorphisme ad hoc• Permet davoir des fonctions de même nom, avec des fonctionnalitéssimilaires, dans des classes sans aucun rapport entre elles . Par exemple, laclasse complexe, la classe image et la classe lien peuvent avoir chacuneune fonction "afficher". Cela permettra de ne pas avoir à se soucier dutype de lobjet que lon a si on souhaite lafficher à lécran. 3
  4. 4. Le polymorphisme ad hoc• Permet ainsi des conversions implicites, ou coercions, présentedans pas mal de langages, au moins pour des types de base, certainspermettant même à l’utilisateur de définir des conversions qui serontappliquées implicitement. Il est donc possible par exemple desurcharger lopérateur (+) et de lui faire réaliser des actions différentesselon quil sagit dune opération entre deux Réels ou entre deux Entiers { …. int x=2 ,y=5; float x1 =2.122 ; Test t1 = new Test () ; t1.Add(x,y); t1.Add(x1,y); …… } 4
  5. 5. Le polymorphisme paramétrique Appelé généricité, représente la possibilité de définir plusieurs fonctions de même nom mais possédant des paramètres différents (en nombre et/ou en type). Rend ainsi possible le choix automatique de la bonne méthode à adopter en fonction du type de donnée passée en paramètre.EXEMPLE :On peut par exemple définir plusieurs méthodes homonymes addition()effectuant une somme de valeurs. • La méthode int addition(int a, int b) pourra retourner la somme de deux entiers • La méthode float addition(float a, float b) pourra retourner la somme de deux flottants • La méthode string addition(char a, char b) pourra la concaténation de deux caractères .Alors , Cest la signature dune méthode qui détermine laquelle seraappelée. 5
  6. 6. Le polymorphisme dhéritage• La possibilité de redéfinir une méthode dans des classes héritant duneclasse de base sappelle la spécialisation. Il est alors possible dappeler laméthode dun objet sans se soucier de son type intrinsèque : il sagit dupolymorphisme dhéritage. Ceci permet de faire abstraction des détails desclasses spécialisées dune famille dobjet, en les masquant par uneinterface commune (qui est la classe de base). 6
  7. 7. Polymorphisme Dynamique et statiquePolymorphisme statique - présentés par les fonctions surchargées aumoment de compilation .Polymorphisme dynamique - présentés en utilisant une liaison dynamiquecrier en runtime. 7
  8. 8. Polymorphisme statique• polymorphisme statique fait référence à une entité existante sousdifférentes formes physiques simultanément.• polymorphisme statique implique la liaison des fonctions basées surle nombre, le type et la séquence des arguments.• Les différents types de paramètres sont spécifiés dans la déclarationde fonction, et donc la fonction peut être lié à des appels à lacompilation.• Cette forme dassociation est appelé une liaison anticipée.• Le terme liaison anticipée découle du fait que lorsque le programmeest exécuté, les appels sont déjà liés à des fonctions appropriées. 8
  9. 9. Polymorphisme statiqueExemple 1: Void affi( int val ) {printf (‘ %d’,val);}; Void affi(float val){printf (‘%f’,val);}; //….. Class test{ int i ; void affiche (){printf (‘%d’,i)} } //…… Void affi(test& val ) {val.affiche ()}; //…….. Void main (){ int Mon_indice = 20; affi(mon_indice); test t1 ; affi (t1); } 9
  10. 10. Polymorphisme dynamique• polymorphisme dynamique réfère à une entité change de forme selonles circonstances.• Une fonction est dite présenter polymorphisme dynamique quand ilexiste dans plus dune forme, et demande à ses diverses formes sontrésolus de façon dynamique lorsque le programme est exécuté.• Le terme liaison dynamique se réfère à la résolution des fonctions aumoment de lexécution au lieu de la compilation.• Cette caractéristique augmente la flexibilité du programme enpermettant la méthode appropriée à être invoqués, selon le contexte.• La combinaison de lhéritage, de la virtualité et la possibilité de surcharger des méthodes permettent ce polymorphisme dynamique. 10
  11. 11. Polymorphisme dynamiquefigure *f;// ...switch(...) { case ... : f = new rectangle; break; case ... : f = new carre; break; case ... : f = new hexagone; break;}f->afficher();// On voudrait appeler la bonne version// de afficher selon la valeur de f// Actuellement : appel de// figure::afficher() !!!// .... transformer afficher// en fonction virtuelle 11
  12. 12. Méthode virtuelle (1)• La mise en place du polymorphisme dynamique se réalise parlintermédiaire des méthodes virtuelles.• Une méthode est marquée virtuelle par lajout du mot clé virtual auniveau de la déclaration uniquement. class figure { ... public: virtual void afficher(void) const; }; class rectangle : public figure { ... public: virtual void afficher(void) const; }; rectangle r; figure *ptf; ptf->afficher() ; // figure::afficher() figure& rf=r; rf.afficher(); //rectangle::afficher() 12
  13. 13. Méthode virtuelle (2)• La détermination de la méthode à appeler est effectuée dynamiquementselon le type effectif de lobjet pointé ou référé (on parle de liaisondynamique).• Une méthode virtuelle reste virtuelle dans tout larbre dedérivation, même si elle nest pas redéclarée virtuelle dans les classesdérivées.• Pour redéfinir une méthode virtuelle héritée, nécessité dadéquationparfaite : signature et type de retour (sinon, la fonction virtuelle estmasquée).• Les fonctions membres statiques ne peuvent pas être virtuelles. 13
  14. 14. Exemple class A { public : virtual void f () { cout << "A"; } ; }; class B : public A { public: // foo reste virtuelle void f () { cout << "B"; } ; }; class C : public B { public: // foo reste virtuelle void f() {cout << "C"; }; }; int main() { A * a = new C; B * b = new C; a->f(); // foo virtuelle --> C::f() 14 b->f(); // foo virtuelle --> C::f()
  15. 15. Merci pour Votre Attention 15
  16. 16. 16

×