Nous avons vu au chapitre 6 que certains membres dune classe pouvaient être publics (les méthodes en général), mais que par défaut ils étaient privés. Pour les structures cest le contraire.
Il existe une troisième catégorie de membres, les membres protégés (protected
). Du point de vue de la classe qui les déclare, ils sont identiques à des membres privés : on ne peut pas y accéder de lextérieur. Par contre, une classe dérivée peut accéder aux membres protégés de sa classe de base (alors quelle ne le peut pas pour les membres privés).
Une classe peut dériver de manière publique dune classe de base, ou de manière privée. Par défaut, une classe dérive de manière privée, et une structure de manière publique. Voici comment les deux types dhéritages influent sur la nature des membres hérités :
Pour dériver une classe de manière publique, comme ce nest pas la valeur par défaut, il faut placer le mot public
devant le nom de la classe de base. Voici quelques exemples :
class A { int a1; protected : int a2; public : int a3; };class B : A { // héritage privé int b1; protected : int b2; public : int b3; };class C : public A { // héritage public int c1; protected : int c2; public : int c3; };
La classe A possède trois membres, un privé a1
, un protégé a2
, un public a3
; de lextérieur seul a3
est accessible. La classe B possède six membres : un indisponible directement a1
, trois privés a2
, a3
et b1
, un protégé b2
et un public b3
; de lextérieur, seul b3
est accessible. Enfin la classe C possède aussi six membres : un indisponible a1
, un privé c1
, deux protégés a2
et c2
et deux publics a3
et c3
; de lextérieur, seuls a3
et c3
sont accessibles.
Pour les structures cest le contraire, puisque lhéritage est par défaut public. Pour le rendre privé, il suffit de placer le mot private
devant le nom de la classe de base. Dans les deux cas, il nexiste pas de dérivation « protégée » .
Il arrive que lon souhaite modifier ces états par défaut pour un membre ou deux seulement. Dans ce cas, il suffit de renommer les membres hérités en les plaçant au bon endroit. Voici un exemple :
class D : private A { // héritage privé int d1; protected : int d2; A::a2; public : int d3; };class E : public A { // héritage public int e1; A::a2; protected : int e2; A::a3; public : int e3; };
La classe D, pour laquelle on a précisé un héritage privé (inutilement, cest la valeur par défaut), diffère de B en ce que le membre hérité a2
est protégé dans D, alors quil était privé dans B. La classe E diffère de C en ce que le membre hérité a2
est privé pour elle (protégé pour C) et a3
est protégé pour elle (public pour C).
On ne peut pas diminuer la protection dun membre par héritage. Si lon essaie dans une classe dérivée de déclarer public un membre protégé de la classe de base, ou si lon essaie de redéclarer un membre privé de la classe de base, on obtient une erreur (Error : Access declarations cannot grant or reduce access, les déclarations daccès ne peuvent pas octroyer ou réduire le niveau daccès).
Bien que lhéritage des classes soit privé par défaut, il est en général préférable de le déclarer public. Par exemple, notre classe rectplein
est mal déclarée à la section précédente, il faut un héritage public :
class rectplein : public rectangle { // ... };
Dans le cas contraire, il ne serait pas possible dappeler les méthodes héritées valeur
et change
à partir dune variable de type rectplein
.
Pour ce qui est des membres, le choix entre les différents accès nest pas toujours évident. En effet, sil est clair que lon doit déclarer publics les membres (en général seulement des méthodes) que lon souhaite accessibles de lextérieur, il nest pas forcément facile de choisir entre privés et protégés pour les autres, puisque cela exige de réfléchir à ce que pourraient être déventuelles classes dérivées de la classe courante. Dans la suite de ce chapitre, nous nous efforcerons de donner quelques indications sur des exemples, car il ny a pas réellement de règle générale en la matière : cela dépend si lon souhaite que les classes dérivées connaissent bien le contenu de leur base ou non.
Précédent | Sommaire | Suivant |