2008-11-21 9 views
5

J'ai une classe dont les classes n'ont vraiment besoin que dans une certaine hiérarchie de classes. Je voulais savoir s'il est possible d'imbriquer la classe dans la section protégée de la classe supérieure et que toutes les autres classes l'héritent automatiquement?Pouvez-vous avoir des classes imbriquées protégées en C++?

+0

Vous devriez l'essayer! Cela ne semble pas trop difficile de trouver une preuve de concept ... – jpoh

Répondre

8

"Hériter" est un mauvais mot à utiliser car il a une définition très spécifique en C++ que vous ne voulez pas dire, mais oui vous pouvez le faire. C'est légal:

class A { 
    protected: 
    class Nested { }; 
}; 

class B : public A { 
    private: 
    Nested n; 
}; 

et le code qui n'est pas A ou quelque chose qui dérive d'un ne peut pas accéder ou instancier A :: emboîtés.

+0

Hmm Que se passe-t-il si la classe B fournit une méthode d'accès pour Nested n? Probablement une erreur de compilation? – Kieveli

+0

En fait, non. Lors de la déclaration des méthodes de B, la recherche de noms a également lieu dans la portée de la classe B. Et dans la portée B, A :: Nested est accessible. Par conséquent, A :: Nested & B :: Get_n() est OK. – MSalters

+1

Hm, vous avez raison. A :: Nested est accessible car B peut retourner un A :: Nested à partir d'une fonction publique. B ce n'est pas encore instanciable, donc de façon intéressante cela conduit à la situation où l'appelant n'est pas autorisé à stocker la valeur de retour de B :: Get_n(). –

Questions connexes