Nous connaissons tous des membres spécifiés protected
d'une classe de base ne peuvent être accédées qu'à partir de la propre instance d'une classe dérivée. Il s'agit d'une fonctionnalité de la norme, qui a été discutée à plusieurs reprises sur Stack Overflow :
- Impossible d'accéder à un membre protégé d'une autre instance à partir de la portée du type dérivé. ;
- Pourquoi mon objet ne peut-il pas accéder aux membres protégés d'un autre objet défini dans une classe de base commune ?
- Et d'autres.
Mais il semble possible de contourner cette restriction avec des pointeurs membres, comme l'utilisateur chtz m'a montré :
struct Base { protected: int value; };
struct Derived : Base
{
void f(Base const& other)
{
//int n = other.value; // error: 'int Base::value' is protected within this context
int n = other.*(&Derived::value); // ok??? why?
(void) n;
}
};
Démonstration en direct sur coliru
Pourquoi cela est-il possible ? S'agit-il d'une fonctionnalité souhaitée ou d'un problème dans la mise en œuvre ou la formulation de la norme ?
Les commentaires ont fait émerger une autre question : si Derived::f
est appelé avec un Base
Est-ce un comportement indéfini ?
0 votes
Les commentaires ne sont pas destinés à une discussion approfondie ; cette conversation a été déplacé vers le chat .
2 votes
@YvetteColomb C'était un effort collectif pour trouver une solution à la question/améliorer la question. N'y a-t-il pas moyen de les remettre en place ? Ils contiennent encore des informations qui pourraient améliorer la réponse acceptée.
0 votes
Ils sont tous encore là dans le chat lié.
1 votes
Qui a sauvé ma journée. Notez que la méthode
f
peut être statique ce qui permet d'éviter la création d'un fichier de typeDerived
objet