Herdando amizade em C ++?
-
16-09-2019 - |
Pergunta
Desde amizade classe não é herdada em C ++, o que é a melhor maneira de "fake" ele?
Eu estava pensando em expor interface privada do amigo de classe através de métodos protegidos na base de classe a-ser-hereditária, mas que resulta em ter que escrever (e manter) a mesma interface duas vezes.
Existem outras maneiras?
Solução
O uso de um tecla é uma solução possível.
A idéia é que você pode desbloquear as operações somente se você tem um tecla ... mas um exemplo vale milhares de palavras de modo mergulho Vamos:
// Step 1: The key
class NeedAccess;
namespace details { class Key { friend NeedAccess; Key() {} }; }
// Step 2: NeedAccess
class NeedAccess
{
protected:
static details::Key GetKey() { return details::Key(); }
};
// Step 3: The big one
class BigOne
{
public:
void lockedMethod(details::Key);
};
A questão da chave construível ser cópia é até discussão. Eu não ver o que você pode ganhar, impedindo-o.
Outra vantagem é que você pode ter várias chaves, dependendo de qual método você deseja acessar, desta forma você conceder amizade 'parcial', e seus amigos 'parciais' não pode mexer com suas partes íntimas, apesar da famosa reivindicação!
Editar :
Este método é chamado limitada Amizade, e foi discutido em comp.lang.c ++. moderado .
A principal vantagem deste método em comparação com interface privada , é a acoplamento fraco, uma vez que apenas declarações para a frente são necessários.
Outras dicas
As crianças da classe com necessidade amizade pedir há pai para fazer o acesso para eles.
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
}
};
Não sei se isso não é o que você já está pensando, mas aqui está um Virtual amigo exemplo