2010-04-13 15 views
10

En C++, vous pouvez placer un membre dans une classe de base et un membre du même nom dans la classe héritée.La classe héritée C++ a un membre du même nom

Comment puis-je accéder à un spécifique dans la classe héritée?

+3

La question que vous devriez vous poser est la suivante: pourquoi avez-vous des classes dans la même hiérarchie d'héritage qui ont des membres nommés en double qui sont distincts? Voir Item C++ effectif 33. – TheJuice

+0

Si votre question est de savoir comment accéder à la méthode dérivée à partir d'une référence de base ou d'un pointeur, ajoutez un commentaire. Comme il est écrit la question peut être interprétée de deux façons (et toutes les réponses traitent seulement l'un d'entre eux) –

Répondre

24

Dans ce cas, vous devez qualifier complètement un nom de membre.

class A 
{ 
public: 
    int x; 
}; 


class B : public A 
{ 
public: 
    int x; 
    B() 
    { 
    x = 0; 
    A::x = 1; 
    } 
}; 
2

En le préfixant avec classname::.

7

Si vous spécifiez le nom, vous accéderez automatiquement à celui de la classe héritée. Si vous voulez dire comment accéder à celui de la classe de base, utilisez Base :: member

3

Oui.

Qualifiez votre appel, f(), avec un nom de classe: SpecificClass::f().

6

Pour accéder au membre caché dans la classe de base, vous devez préfixer le nom du membre avec le nom de la classe de base. Voir ci-dessous:

class A 
{ 
protected: 
    int i; 
}; 

class B : public A 
{ 
public: 
    void foo(void) 
    { 
     int a_i = A::i; 
     int b_i = i; 
     int b_i_as_well = B::i; 
    } 
private: 
    int i; 
}; 
+0

+2 [je souhaite] pour l'exemple. –

3

Une approche (déjà mentionné dans toutes les autres réponses) est d'utiliser le nom de membre qualifié, comme Base::member. Il peut être utilisé conjointement avec un accès explicite via le pointeur this, si c'est votre style: this->Base::member.

Une autre approche consiste à effectuer un accès via le pointeur this explicitement converti au type de classe de base: ((Base *) this)->member.

Bien sûr, les références ci-dessus au pointeur this sont faites en supposant que vous essayez d'accéder au membre depuis une certaine fonction membre non statique de la classe. Pour accéder à partir de "outside", les mêmes astuces peuvent être appliquées à tout autre pointeur (ou référence): some_pointer->Base::member ou ((Base *) some_pointer)->member.

Pour les membres de données, ces deux approches sont équivalentes. Pour les fonctions membres, elles peuvent aboutir à des résultats différents avec des fonctions virtuelles. Pour cette raison, en général, la première approche devrait être préférée.

Questions connexes