Partager via


Pointeurs vers des classes

Il existe deux cas dans lesquels un pointeur vers une classe peut être converti en un pointeur vers une classe de base.

Notes

Le premier cas est lorsque la classe de base spécifiée est accessible et la conversion est ambiguë.(Consultez plusieurs classes de base pour plus d'informations sur les références ambiguës de classe de base.)

Si une classe de base est accessible dépend du type d'héritage utilisé dans la dérivation.Considérez l'héritage représentée dans l'illustration suivante.

Héritage Graphique pour l'instanciation de la classe de base Accessibilité

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

Le tableau suivant montre l'accessibilité de la classe de base pour la situation illustrée dans l'illustration.

Classe de base Accessibilité

type de fonction

dérivation

conversion de

B* à A* autorisé ?

fonction externe (pas de classe-scoped)

Privé

Non

 

Protégé

Non

 

Public

Oui

fonction membre de B (dans l'indicateur type B)

Privé

Oui

 

Protégé

Oui

 

Public

Oui

Fonction membre C (dans l'indicateur type C)

Privé

Non

 

Protégé

Oui

 

Public

Oui

Le deuxième cas où un pointeur vers une classe peut être converti en un pointeur vers une classe de base est lorsque vous utilisez une conversion de type explicite.(Voir l' Expressions avec les conversions de type explicite pour plus d'informations sur les conversions de type explicite.)

Le résultat d'une telle conversion est un pointeur vers « sous-objet, » la partie de l'objet qui est totalement décrit par la classe de base.

Le code suivant définit deux classes, A et B, où B est dérivé d' 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 du type A *, qui peut être interprète comme une signification « pointeur vers un objet de type A ». Les membres d' bObject (tel qu' BComponent et BMemberFunc) sont uniques pour taper B et sont donc pAvia inaccessible.Le pointeur d' pA permet uniquement l'accès à ces caractéristiques (fonctions membres et des données) de l'objet définies dans la classe A.

Voir aussi

Référence

Conversions de pointeur (C++)