Acesso ao membro protegido por meio de ponteiro de membro: é um hack?
Todos conhecemos membros especificadosprotected
de uma classe base só pode ser acessada a partir de uma instância própria da classe derivada. Este é um recurso do Standard, e isso foi discutido no Stack Overflow várias vezes:
Mas parece possível contornar essa restrição com ponteiros de membro, pois o usuário chtzme mostrou:
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;
}
};
Demonstração ao vivo no coliru
Por que isso é possível, é um recurso desejado ou uma falha em algum lugar na implementação ou na redação do Padrão?
Dos comentários surgiu outra pergunta:E seDerived::f
é chamado com um realBase
, é um comportamento indefinido?