Compatibilité

Lorsqu’on utilise une variable d’une classe, il est possible de lui affecter une variable de la classe dérivée :

rectangle r;rectplein rp;     // rectplein dérive de rectangle r = rp            // parfaitement correct

Dans ce cas, seuls les champs de la classe rectangle, hérités par rp, sont recopiés dans r. Plus généralement, une variable d’une classe dérivée peut être utilisée partout où cela est possible pour la classe de base.

Le contraire n’est naturellement pas vrai : la classe rectangle n’a pas de champ couleur, il lui est impossible de se comporter de la même façon que rectplein. L’affectation inverse rp = r est donc impossible, sauf si l’on définit un opérateur d’affectation adéquat, et un constructeur pour les initialisations. On pourrait le faire ainsi par exemple :

class rectplein : public rectangle {     // ...     public :     rectplein(rectangle& r, couleur = 0)             : rectangle(r) {          coul = couleur; trace();         }     // ...     rectplein& operator=(rectangle& r) {         efface;         *(rectangle*)this = r;         trace();         }     }

Noter toutefois que l’affectation explicite par changement de type dans operator= est un appel à l’affectation rectangle::operator=, qui provoque a priori aussi un effacement et un appel à rectangle::trace() indésirables (quoique sans gravité ici). Il est donc préférable d’éviter les affectations ayant de tels effets de bord, dans la mesure du possible.

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