2010-01-26 10 views
7

Si una clase derivada se hereda de forma privada de una clase base y la clase derivada tiene una función amiga f(), ¿qué miembros pueden acceder desde la clase derivada y la clase base?función de amigo en clase derivada con herencia privada

class Base { 
public: 
    int a; 
protected: 
    int b; 
private: 
    int c; 
}; 


class Derived: private Base {  
    void friend f() {} 

public: 
    int d; 
protected: 
    int e; 
private: 
    int f; 
}; 

entiendo que si una clase se hereda de forma privada de la clase base, todo lo que es privado en la clase derivada.

¿Pero por qué en el código anterior, la función f() puede acceder a a, b, d, e, f pero no c?

Respuesta

9

'Amistad' otorga acceso a la clase que declara el amigo, no es transitivo. Para usar una mala analogía, mis amigos no son necesariamente los amigos de mi papá.

El C++ FAQ tiene un poco más de detalle:

+5

+1 para la analogía. –

+1

La analogía en este caso sería más cercana a: 'otorgar acceso a mis amigos a mi casa no les dará acceso a la protección de mi padre que no puedo abrir' –

+0

@dribeas: Sí, su analogía está más cerca del comportamiento de C++. –

2

No se puede acceder a los miembros privados en las clases derivadas.

6

Un amigo Derived puede acceder exactamente lo Derived sí puede - es decir, cualquier miembro de Derived, y cualquier miembro del público o protegido de cualquier clase base, o de cualquier clase Grand-padres público o protegido, pero no cualquier miembro privado de las clases base, o miembros de clases privadas de padres.

2

función El amigo tiene acceso a todos los miembros de derivados. No tiene acceso a ningún miembro de Base que derivado no puede acceder. Derivado no puede acceder a Base :: c porque Base :: c es privado.

Cuestiones relacionadas