Lorsquon utilise une variable dune 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 dune classe dérivée peut être utilisée partout où cela est possible pour la classe de base.
Le contraire nest naturellement pas vrai : la classe rectangle na pas de champ couleur, il lui est impossible de se comporter de la même façon que rectplein. Laffectation inverse rp = r est donc impossible, sauf si lon définit un opérateur daffectation 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 laffectation explicite par changement de type dans operator= est un appel à laffectation 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.
| Suivant |