2011-09-10 18 views
27

¿Hereda una subclase, las asociaciones de amigos de la clase principal (tanto la propia clase principal como otras clases relacionadas con la clase principal)?C++ friend inheritance?

O para decirlo de otra manera, ¿cómo se aplica la herencia a la palabra clave friend?

Para expandir: Y si no, ¿hay alguna forma de heredar la amistad?

he seguido la sugerencia de Jon para colocar el problema de diseño:
C++ class design questions

+3

Si su diseño necesita Inherited Friendship, es una buena indicación de que su diseño necesita un cambio. –

+0

¿Cuál es el caso de uso para esta función? Dependiendo de lo que realmente desea hacer, puede haber otras alternativas que hacer que todas sus clases sean tan amigables –

+0

@David: Incluiré un enlace a una pregunta que describa la situación. – SSight3

Respuesta

35

La amistad no se hereda en C++.

La norma dice (ISO/IEC 14882: 2003, sección 11.4.8):

La amistad no es ni hereditaria ni transitiva.

+0

¿Hay alguna forma de hacerlo así que hereda? – SSight3

+2

@ SSight3: No, necesitaría hacer todas las clases en los amigos de jerarquía explícitamente (posiblemente con la ayuda de un preprocesador de código fuente). Si tiene un problema específico que resolver, pregúntelo explícitamente. – Jon

+0

Suena como una buena sugerencia. – SSight3

2

La respuesta es muy simple: no, subclases no heredan las asociaciones de amistad. Un amigo solo puede acceder a los miembros privados de la clase en la que está declarada la asociación, no a los padres y/o hijos de esa clase. Aunque puede ser miembro protegido de una superclase, pero no estoy seguro de eso.

+2

Una clase Derivada siempre puede acceder a los miembros protegidos de la clase Base, es a través de ** Herencia ** no ** Amigo ** nave. –

+0

@Als: 'Una clase derivada siempre puede acceder a miembros protegidos de la clase Base'. No, en realidad depende. Depende del tipo de herencia! – Nawaz

+0

@Nawaz: ¡No realmente! [cuáles son los especificadores de acceso si debo heredar con protección privada o pública] (http://stackoverflow.com/questions/5447498/what-are-access-specifiers-should-i-inherit-with-private-protected-or-public /% 5d) debería ser una buena lectura para ti. –

6

Puede crear métodos protegidos (estáticos) en el elemento primario que le permitan hacer cosas como esa.

class MyFreind 
{ 
private: 
    int m_member; 
    friend class Father; 
}; 

class Father 
{ 
protected: 
    static int& getMyFreindMember(MyFreind& io_freind) { return io_freind.m_member; } 
}; 

class Son : public Father 
{ 
public: 
    void doSomething(MyFriend& io_freind) 
    { 
     int& friendMember = getMyFreindMember(io_freind); 
     // .... 
    } //() 
}; 

Esto, sin embargo, evita el encapsulamiento, por lo que probablemente deba echar un segundo vistazo a su diseño.

+0

Esto parece más aplicable a la otra pregunta vinculada también. Buena respuesta. Estoy pensando en un rediseño en proceso. – SSight3