Partager via


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

Accessibilité de la classe de base d'un graphique d'héritage

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.

Voir aussi

Référence

Conversions de pointeur (C++)