Programmation • IoT

Résumé : Chap 3 – L’héritage

Ce chapitre a pour objectif d’introduire l’héritage comme un mécanisme permettant de construire une classe spécialisée à partir d’une classe plus générale.

Il commence par comparer les vecteurs à deux et à trois dimensions. Malgré leurs nombreuses ressemblances, un vecteur quelconque de l’espace n’est pas un vecteur du plan : l’héritage ne doit donc pas être utilisé uniquement pour éviter la répétition du code.

Le lecteur apprend ainsi qu’une relation d’héritage doit traduire une véritable relation « est un ». Une classe dérivée doit représenter une forme particulière de sa classe de base.

Les matrices fournissent un exemple plus naturel. Toute matrice carrée est une matrice, mais toute matrice n’est pas nécessairement carrée. La classe MatriceCarree peut donc légitimement dériver de Matrice.

La construction de la classe de base permet également de revoir la gestion d’un tableau dynamique, l’accès aux coefficients, la multiplication matricielle et les opérations de copie nécessaires lorsqu’une classe possède une ressource mémoire.

Une classe dérivée réutilise les méthodes accessibles de sa classe de base et peut ajouter ses propres fonctionnalités. Une matrice carrée hérite ainsi des opérations générales sur les matrices et fournit en plus son ordre et le calcul de son déterminant.

Le chapitre explique que la partie correspondant à la classe de base est construite avant la partie dérivée. Lors de la destruction, l’ordre est inversé : la classe dérivée est détruite avant sa classe de base.

Les niveaux d’accès private et protected sont étudiés dans ce contexte. Les membres privés existent bien dans l’objet dérivé, mais ils restent accessibles uniquement par l’intermédiaire de l’interface de la classe de base.

Le calcul récursif du déterminant montre comment une classe spécialisée peut enrichir les comportements hérités en construisant des matrices mineures de tailles successivement plus petites.

Le lecteur découvre également qu’un objet dérivé peut être manipulé à travers une référence vers sa classe de base. L’objet reste le même, mais l’interface visible dépend alors du type de la référence.

Cette conversion ne fonctionne pas automatiquement dans l’autre sens. Une matrice possédant autant de lignes que de colonnes reste de type Matrice si elle a été construite ainsi ; son état particulier ne transforme pas son type C++.

L’héritage peut enfin s’étendre sur plusieurs niveaux, comme dans la hiérarchie Matrice, MatriceCarree et MatriceSymetrique. Les constructeurs et les fonctionnalités héritées se transmettent alors le long de la hiérarchie.

Une classe spécialisée doit néanmoins préserver les propriétés qui la définissent. La classe représentant une matrice symétrique adapte donc la modification d’un coefficient afin de mettre également à jour son coefficient symétrique.

Le but général est ainsi d’apprendre à concevoir des hiérarchies cohérentes, à réutiliser une représentation et des comportements existants, puis à les enrichir sans perdre les garanties propres aux classes spécialisées.