Acceso al miembro protegido a través del puntero de miembro: ¿es un truco?
Todos conocemos miembros especificadosprotected
desde una clase base solo se puede acceder desde una propia instancia de clase derivada. Esta es una característica del Estándar, y esto se ha discutido en Stack Overflow varias veces:
Pero parece posible sortear esta restricción con punteros de miembros, como el usuario chtzme ha mostrado:
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;
}
};
Demostración en vivo en coliru
¿Por qué es esto posible, es una característica deseada o un problema técnico en algún lugar de la implementación o la redacción del Estándar?
De los comentarios surgió otra pregunta:SiDerived::f
se llama con un realBase
, ¿es un comportamiento indefinido?