Pointeurs vers les classes
Il existe deux cas dans lesquels un pointeur vers une classe peut être converti en un pointeur vers une classe de base.
Notes
Dans le premier cas, la classe de base spécifiée est accessible et la conversion est n'est pas ambiguë. (Consultez Classes de base multiples pour plus d'informations sur les références de classe de base ambiguës.)
L'accessibilité d'une classe de base dépend du type d'héritage utilisé dans la dérivation. Prenons l'héritage illustré dans l'illustration suivante.
Graphique d'héritage pour l'illustration de l'accessibilité de la classe de base
Le tableau suivant indique l'accessibilité de la classe de base d'après la situation illustrée.
Accessibilité de la classe de base
Type de fonction |
Dérivation |
Conversion de B* à A* autorisé ? |
---|---|---|
Fonction externe (hors portée de classe) |
Privé |
Non |
|
Protégé |
Non |
|
Public |
Oui |
Fonction membre B (dans la portée B) |
Privé |
Oui |
|
Protégé |
Oui |
|
Public |
Oui |
Fonction membre C (dans la portée C) |
Privé |
Non |
|
Protégé |
Oui |
|
Public |
Oui |
Dans le second cas, un pointeur vers une classe peut être converti en pointeur vers une classe de base lorsque vous utilisez une conversion de type explicite. (Pour plus d'informations sur les conversions de type explicite, consultez Expressions avec conversions de type explicite.)
Le résultat de ce type de conversion est un pointeur vers le « sous-objet », la partie de l'objet qui est complètement décrite par la classe de base.
Le code suivant définit deux classes, A et B, où B est dérivée de A. (Pour plus d'informations sur l'héritage, consultez Classes dérivées.) Il définit ensuite bObject, un objet de type B, et deux pointeurs (pA et pB) qui pointent vers l'objet.
// conve__pluslang_Pointers_to_Classes.cpp
// C2039 expected
class A
{
public:
int AComponent;
int AMemberFunc();
};
class B : public A
{
public:
int BComponent;
int BMemberFunc();
};
int main()
{
B bObject;
A *pA = &bObject;
B *pB = &bObject;
pA->AMemberFunc(); // OK in class A
pB->AMemberFunc(); // OK: inherited from class A
pA->BMemberFunc(); // Error: not in class A
}
Le pointeur pA est de type A *, ce qui peut être interprété comme suit : « pointeur vers un objet de type A ». Les membres de bObject (tels que BComponent et BMemberFunc) sont propres au type B et sont donc inaccessibles via pA. Le pointeur pA autorise l'accès uniquement aux caractéristiques (fonctions membres et données) de l'objet définies dans la classe A.