2008-11-21 689 views
5

Tengo una clase que solo realmente necesitan las clases en una cierta jerarquía de clases. Quería saber si es posible anidar la clase en la sección protegida de la clase más alta y hacer que todas las otras clases la hereden automáticamente.¿Puede haber protegido clases anidadas en C++?

+0

¡Deberías probarlo! No parece demasiado difícil obtener una prueba de concepto ... – jpoh

Respuesta

8

"Heredar" es la palabra incorrecta para usar, ya que tiene una definición muy específica en C++ que no quiere decir, pero sí puede hacerlo. Esto es legal:

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

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

Y el código que no está en A o algo que se deriva de A no puede acceder o crear una instancia de A :: Nested.

+0

Hmm ¿Qué sucede si la clase B proporciona un método de acceso para Anidado n? Probablemente un error de compilación? – Kieveli

+0

En realidad, no. Al declarar métodos de B, la búsqueda de nombres también ocurre en el alcance de la clase B. Y en el alcance B, A :: Anidado está accesible. Por lo tanto, A :: Anidado & B :: Get_n() está bien. – MSalters

+1

Hm, estás en lo cierto. A :: Anidado está accesible ya que B puede devolver un A :: anidado de una función pública. B aún no es instanciable, por lo que resulta interesante que la persona que llama no tenga permitido almacenar el valor de retorno de B :: Get_n(). –

Cuestiones relacionadas