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é
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.