41 votes

L'héritage des amis du C++ ?

Une sous-classe hérite-t-elle des associations d'amis de la classe principale (à la fois celles de la classe principale et celles des autres classes amies de la classe principale) ?

Ou, pour le dire autrement, comment l'héritage s'applique-t-il au mot-clé "ami" ?

Pour développer : Et si non, y a-t-il un moyen d'hériter de l'amitié ?

J'ai suivi la suggestion de Jon de poster le problème de conception :
Questions sur la conception des cours de C++

47voto

Jon Points 194296

L'amitié n'est pas héritée en C++.

La norme dit (ISO/IEC 14882:2003, section 11.4.8) :

L'amitié n'est ni héritée ni transitive.

12voto

selalerer Points 1754

Vous pouvez créer des méthodes (statiques) protégées dans le parent qui vous permettront de faire ce genre de choses.

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);
        // ....
    } // ()
};

Cependant, cela contourne l'encapsulation et vous devriez probablement revoir votre conception.

9voto

balki Points 4786

Friend ne s'applique qu'à la classe que vous rendez explicitement amie et à aucune autre classe.

http://www.parashift.com/c++-faq-lite/friends.html#faq-14.4

2voto

Aardvark Soup Points 41

La réponse est très simple : non, les sous-classes n'héritent pas des associations d'amis. Un ami ne peut accéder qu'aux membres privés de la classe dans laquelle l'association est déclarée, et non à ceux des parents et/ou des enfants de cette classe. Bien que vous puissiez avoir accès aux membres protégés d'une superclasse, mais je n'en suis pas sûr.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X