We all know members specified protected
from a base class can only be accessed from a derived class own instance. This is a feature from the Standard, and this
The fact that a member is not accessible using class member access expr.ref (aclass.amember
) due to access control [class.access] does not make this member inaccessible using other expressions.
The expression &Derived::value
(whose type is int Base::*) is perfectly standard compliant, and it designates the member value
of Base
. Then the expression a_base.*p
where p
is a pointer to a member of Base
and a_base
an instance of Base
is also standard compliant.
So any standard compliant compiler shall make the expression other.*(&Derived::value);
defined behavior: access the member value
of other
.