In this answer to the question "Why can't my object access protected members of another object defined in common base class?", one can read:
You can only access protected members from your own base class instance.
Either I don't get it correctly or the following MCVE (live on coliru) proves it wrong:
struct Base { void f(); protected: int prot; };
struct Derived : Base { void g(); private: int priv; };
void Base::f()
{
Base b;
b.prot = prot;
(void) b;
}
void Derived::g()
{
{
Derived d;
(void) d.priv;
}
{
Derived& d = *this;
(void) d.priv;
}
{
Derived d;
(void) d.prot; // <-- access to other instance's protected member
}
{
Derived& d = *this;
(void) d.prot;
}
// ---
{
Base b;
(void) b.prot; // error: 'int Base::prot' is protected within this context
}
{
Base& b = *this;
(void) b.prot; // error: 'int Base::prot' is protected within this context
}
}
In the light of the two errors I get to wonder: why can I access to another Derived
instance's protected member from the scope of Derived
but cannot access to another Base
instance's protected member from the same scope regardless of the fact that Derived
devires from Base
? Tl; dr: what makes protected
more "private" than private
in this case?
Notes:
- please don't close this question as a duplicate of the linked question;
- better title suggestion are welcome.