Мы все знаем, что члены, указанные protected
из базового класса, могут быть доступны только из собственного экземпляра производного класса. Это функция из Стандарта, и это обсуждалось в Qaru несколько раз:
- Невозможно получить доступ к защищенному члену другого экземпляра из области производного типа;
- Почему мой объект не может защищать члены другого объекта, определенные в общем базовом классе?
- И другие.
Но кажется, что можно обойти это ограничение с помощью указателей элементов, так как пользователь chtz показал мне:
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;
}
};
Почему это возможно, это желаемая функция или сбой в реализации или формулировка Стандарта?
Из комментариев возник еще один вопрос: если Derived::f
вызывается с фактическим Base
, это поведение undefined?