Traduit de l'anglais par Stéphane Bailliez
Les FAQs de la section [19]
[19.1]
L'héritage est il important en C++?
Oui. L'héritage est la différence fondamentale entre
la programmation avec des types de données abstraits (abstract
data type - ADT) et la programmation OO.
[ Haut | Bas
| Section précédente
| Section suivante
]
[19.2]
Quand dois-je utiliser l'héritage?
Pour exprimer la spécificité. L'être humain effectue
une abstraction de deux manières: l'association (part-of) et la
généralisation (kind-of). Une Renault Espace est une sorte
de (is-a-kind-of) Voiture et une Renault Espace a (has-a) un Moteur, des
Pneus, etc... La notion d'association/appartenance fait partie du monde
du développement depuis que la programmation ADT a été
reconnue, l'héritage ajoute "l'autre" majeure dimension de la décomposition.
[ Haut | Bas
| Section précédente
| Section suivante
]
[19.3]
Comment exprime t-on l'héritage en C++?
A l'aide de la syntaxe : public class
Car : public Vehicle {
public:
// ...
};
On mentionne cette
relation de pluseiurs manières:
- Car est
une sorte de Vehicle
- Car est "dérivée
de" Vehicle
- Car est un Vehicle spécialisé.
- Car est une "sous-classe" de Vehicle
- Vehicle
est une "classe de base" de Car
- Vehicle est
la "superclasse" de Car (N.D.T. pas trés courant dans
la communauté C++ mais trés courant au sein de la communauté
Java)
(Note: cette FAQ est relative à l'héritage
public; l'héritage
private et l'héritage protectedsont différents.)
[ Haut | Bas
| Section précédente
| Section suivante
]
[19.4]
Est ce légal de convertir un pointeur sur une classe dérivée
en sa classe de base ?
Oui. Un objet d'une classe dérivée est une sorte de (is
a kind of) la classe de base. La conversion d'un pointeur sur une classe
dérivée en un pointeur sur sa classe de base est donc parfaitement
légal est arrive constamment. Par example si je pointe sur une
voiture, je pointe en fait sur un véhicule, donc convertir de Car*
vers un Vehicle* est tout a fait légal et normal.
void f(Vehicle* v);
void
g(Car* c) { f(c); } // autorisé, pas de cast nécessaire
(Note:
this FAQ has to do with public inheritance; private and protected inheritance
are different.)
[ Haut | Bas
| Section précédente
| Section suivante
]
[19.5]
Quelle est la différence entre public:, private:,
et protected:?
- Un membre (un attribut ou une méthode) déclaré
dans la section private: d'une classe peut uniquement être
accédés par les méthodes membres et les amis (friends )
de cette classe
- Un membre (un attribut ou une méthode)
déclaré dans la section protected: d'une
classe, peut uniquement être accédé par les membres
et les amis (friends) de cette
classe, ainsi que par les méthodes membres et les amis(friends ) des classes dérivées.
- Un membre (un attribut ou une méthode) déclaré
dans la section public: d'une classe peut être accédé
par n'importe qui.
[Haut
[ Haut | Bas
| Section précédente
| Section suivante
]
[19.6]
Pourquoi mes classes dérivées ne peuvent elles accéder
aux élements en private: de ma classe de base?
Pour vous protéger de changements pouvent subvenir ultèrieurement
dans la classe de base. Les classes dérivées ne peuvent
accéder aux membres privées de la classe de base. Cela permet
d'éviter les classes dérivées de subir un changement
réalisé dans la classe de base. Si vous avez 15 classes
dérivées utilisant des membres de la classe de base. Un
changement de la classe de base vous forcera à modifier vos 15
classes dérivées !
[ Haut | Bas
| Section précédente
| Section suivante
]
[19.7]
Comment puis je protéger mes classes dérivées
de l'impact concernant les changements des attributs de la classe de base?
Une classe a deux interfaces distinctes avec deux types de clients distincts:
- Elle a une interface public: qui est utilisée
par les les classes n'ayant aucune relation avec celle ci.
- Elle
a une interface protected: qui est utilisée par les classes
dérivées.
Il est donc préférable
de garder les attributs de la classe de base en private:, et
d'utiliser des accesseurs en protected:inline, de cette
manière les classes dérivées accéderont aux
attributs privatede la classe de base et cela minimisera voire
supprimera l'impact d'un changement des données en private sur
les classes dérivées.
[ Haut | Bas
| Section précédente
| Section suivante
]
Ecrire à l'auteur,
au traducteur,
ou en savoir plus sur la traduction.
[ C++ FAQ Lite fr |
Table des matières |
Index |
A propos de l'auteur |
© |
Téléchargez votre propre copie ]
Dernière révision le 12 Nov 2002