Compatibilité des pointeurs

Les pointeurs d’une classe de base sont compatibles avec ceux des classes dérivées :

rectangle *pr;rectplein rp, *prp = &rp;pr = prp;            // autorisé

Il n’est pas nécessaire de préciser un changement de type. Par contre, en sens inverse il faut le faire, et l’opération est alors périlleuse, car l’ordinateur risque fort de se planter si l’on fait un appel à une méthode de rectplein avec un pointeur à qui l’on a affecté une valeur rectangle*. On sait de toute façon que les changements de types sur les pointeurs doivent être employés avec prudence.

Contrairement à l’affectation d’une instance de la classe dérivée vers la classe de base, qui fait perdre de l’information (les membres spécifiques à la classe dérivée sont perdus), l’affectation identique avec les pointeurs ne fait rien perdre : les membres dérivés sont simplement momentanément inaccessibles. Les méthodes virtuelles de la classe de base sont cependant appelées correctement. Par exemple, si l’on a défini un destructeur virtuel et deux méthodes virtuelles trace et efface, les appels suivants seront corrects :

rectangle r, *pr = new rectangle(r);pr->trace();        // appel de rectangle::tracedelete pr;          // appel de rectangle::~rectanglepr = new rectplein();pr->trace();        // appel de rectplein::tracedelete pr;          // appel de rectplein::~rectplein

Cela explique pourquoi l’on parle de polymorphisme. On retiendra l’importance qu’il y a à déclarer des destructeurs virtuels, même s’ils ne font rien : il n’en sera pas forcément de même dans les classes dérivées, et le compilateur, comme l’exemple ci-dessus le montre clairement, ne peut pas déterminer correctement sur quel genre d’objet pointe pr, et donc quel destructeur appeler s’il n’est pas virtuel. Noter que pour la même raison, l’appel de sizeof(*pr) donnera toujours la taille de la classe de base rectangle, même si pr pointe sur un objet rectplein. On se méfiera de cet opérateur qui ne peut de surcroît pas être redéfini.

Précédent Précédent Sommaire Sommaire Suivant Suivant