Résumé – Chap 4 – Le polymorphisme
Ce chapitre a pour objectif de montrer comment des objets appartenant à des classes différentes peuvent être manipulés à travers une interface commune tout en conservant leur comportement propre.
Les classes Carre et Disque représentent des formes différentes, mais elles proposent toutes deux le même service : calculer une aire. La méthode porte le même nom, tandis que son implémentation dépend de la forme concernée.
Le lecteur découvre qu’une référence vers la classe de base Forme peut désigner un objet appartenant à l’une de ses classes dérivées. Sans mécanisme particulier, la méthode appelée dépend toutefois du type statique de cette référence.
Le mot-clé virtual permet de modifier ce comportement. La méthode est alors sélectionnée pendant l’exécution selon le type réel, ou type dynamique, de l’objet reçu.
Cette liaison dynamique permet à une fonction unique de recevoir n’importe quelle forme et d’appeler automatiquement la bonne version de la méthode aire().
Le mot-clé override est introduit afin d’indiquer explicitement qu’une méthode redéfinit une méthode virtuelle héritée. Le compilateur peut ainsi vérifier la signature et détecter certaines erreurs.
Le chapitre distingue la liaison statique, déterminée par le type connu lors de la compilation, de la liaison dynamique, qui tient compte du type réel de l’objet pendant l’exécution.
Le polymorphisme dynamique fonctionne au moyen de références ou de pointeurs vers une classe de base. Les références restent liées au même objet, tandis que les pointeurs peuvent être réaffectés pour désigner différents objets.
Une fonction virtuelle pure, déclarée avec = 0, exprime une opération commune pour laquelle la classe de base ne possède aucune implémentation générale pertinente.
Une classe contenant une telle fonction devient abstraite. Elle ne peut pas être instanciée directement, mais elle peut définir l’interface que toutes les classes dérivées concrètes devront respecter.
Le chapitre souligne également l’importance du destructeur virtuel. Lorsqu’un objet dérivé est détruit avec delete à travers un pointeur vers sa classe de base, ce mécanisme garantit l’exécution correcte de toute la chaîne de destruction.
Une collection de pointeurs vers la classe de base peut enfin réunir des carrés, des disques, des triangles ou d’autres formes. Le même appel de méthode produit alors automatiquement le comportement correspondant à chaque objet.
Le but général est donc de séparer l’opération demandée de la manière dont elle est réalisée. Le code utilisateur travaille avec une interface commune, tandis que chaque classe spécialisée reste responsable de son propre comportement.