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 ![]() |