Le polymorphisme En C++
Introduction au concept de polymorphisme.
Le polymorphisme est un concept des langages objet qui découle directement de l'héritage. Ce concept s'applique uniquement aux fonctions membres de classes dérivées. Il consiste à redéfinir une fonction pour une classe. Ainsi, une même fonction aura un traitement différent pour deux objets differents.
Le Polymorphismes en C++.
En C++, il faut indiquer au compilateur qu'il a affaire à une fonction polymorphe, sinon il serait tenté d'utiliser la fonction de la classe de base. En fait, s'il y a un accès par référence, alors la fonction utilisée sera la fonction "terminal", alors que si l'accès se fait par adresse alors il utilisera la fonction du type de l'objet.
Il ne faut pas oublier de rappeler qu'il est possible de pointer un objet derivé par un pointeur vers un objet de la classe de base. Pour permettre d'utiliser la fonction la plus "evoluée" dans l'architecture de vos classes, il vous faudra utiliser le mot cle virtual du C++ devant le prototype de la fonction qui doit etre polymorphe (et devant le prototype seulement). Il faut le specifier devant la fonction de base uniquement pour qu'elle puisse être "polymorphée". Mais en general, on le met devant tous les prototypes de cette fonction. Ainsi, on permet une future derivation. Il est à noter que si une fonction virtuelle n'est pas redefinie, le programme utilisera la dernière fonction redéfinie. Il se peut que la fonction polymorphe consiste à faire la même chose que la fonction de base, plus un traitement. A ce moment là on peut appeler la fonction d'une classe précédente en faisant: <classe_de_base>::<fonction> (<parametre>);
Polymorphisme et constructeur/destructeur.
Si vous definissez un destructeur pour votre classe, vous êtes obligés de le definir virtuellement. Evidement, il faut que l'ensemble de l'objet soit détruit... En ce qui concerne les constructeurs, il est à noter qu'ils ne peuvent appeler de fonction polymorphe. De plus, ni les constructeurs ni les destructeurs ne peuvent être polymorphes.
Une classe abstraite est une classe qui contient au moins une fonction virtuelle pure, ou qui n'a pas redéfinit une fonction virtuelle pure. Une fonction virtuelle pure est une fonction virtuelle dont le corps est explicitement non donné, on precise un =0 a la fin du prototype d'une telle fonction.
Une classe abstraite est une classe dont aucun objet de ce type ne peut etre créé. Ainsi l'abstraction de la classe se propagera dans les classes dérivées tant que cette fonction n'aura pas été redéfinie. Cela est relativement pratique dans le cas d'une classe définissant un concept général, et non une classe en elle même. On pourait par exemple imaginer une classe arme se derivant en arme_blanche et arme_feu. Il est evident qu'ici aucun objet de type arme ne sera créé car arme est un concept general. On pourra donc specifier une fonction virtuelle pure dans la classe arme.