8
votes

Héritage d'amitié en C ++?

Depuis que la classe amitié n'est pas héritée en C ++, quelle est la meilleure façon de "faire semblant"?

Je pensais à exposer l'interface privée de la classe d'amis à travers des méthodes protégées dans la classe de base to-héritée, mais cela permet d'écrire (et de maintenir) la même interface deux fois.

Y a-t-il d'autres manières?


0 commentaires

3 Réponses :


9
votes

L'utilisation d'une clé est une solution possible.

L'idée est que vous ne pouvez déverrouiller les opérations que si vous avez une clé L'exemple vaut des milliers de mots, alors plongez: xxx

La question de la clé en cours de copie constructible est à la discussion. Je ne vois pas ce que vous pouvez gagner en l'empêchant.

Un autre avantage est que vous pouvez avoir plusieurs clés, selon la méthode que vous souhaitez accéder, de cette façon, vous accordez une amitié «partielle» et votre Les amis «partiels» ne peuvent pas gâcher avec vos parties privées, malgré la réclamation célèbre!

EDIT :

Cette méthode est appelée amitié limitée et a été discuté sur comp.lang.c ++. Modéréré .

L'avantage principal de cette méthode par rapport à interface privée est le couplage lâche, car seules les déclarations avant sont nécessaires.


2 commentaires

Étant donné que clé est une classe vide, il dispose-t-il d'un effet de pile-Wize / Memory-Wize, ou le compilateur traite-t-il uniquement comme "Syntaxtic-Sugar"?


Une classe vide «pèse» quelque chose (au moins une valeur d'octets de données, souvent plus de problèmes d'alignement). Il existe une optimisation appelée optimisation de base vide, qui consiste à hériter de la classe vide pour éviter de subir cette surcharge. Vous pouvez donc choisir d'avoir de besoin hériter de la clé de et de renvoyer une référence au lieu d'une copie ... mais une référence "pèse aussi quelque chose.



0
votes

Je ne sais pas si ce n'est pas ce que vous pensez déjà, mais voici un Ami virtuel exemple


0 commentaires

2
votes

Les enfants de la classe avec frinetship ont besoin de demander à leur parent de faire l'accès pour eux.

class CrustyNeighbour
{
    private:
       friend class Bob;
       void useWiFi(std::string const& data);
};

class Bob
{
    protected:
        useWifi(CrustyNeighbour& neighbour,std::string const& data)
        {  neighbour.useWiFi(data);}
};

class Mary: public Bob // Bob's offspring
{
     void playHalo(WifiOwner& owner) // WifiOwner derived from CrustyNeighbour
     {
         useWifi(owner,gameData);  // use wifi via his/her parent who access to eighbours wifi
     }
};


0 commentaires