訪問另一個實例的保護成員在this answer問題「?共同基類中定義另一個對象爲什麼不是我的對象訪問保護成員」,一個可以讀取:不能從派生類型的範圍
您只能從您自己的基類實例訪問受保護的成員。
要麼我沒有正確地得到它或following MCVE (live on coliru)證明她錯了:
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
}
}
在兩個錯誤,我得到想知道的光:我爲什麼能訪問到另一個Derived
實例的保護成員從Derived
的範圍,但無法從相同範圍訪問另一個Base
實例的受保護成員,而不管Derived
是否從Base
開始? TL;博士:在這種情況下,protected
比private
更「私人」嗎?
注:
- 請不要關閉這個問題作爲鏈接的問題的重複;
- 更好的標題建議是受歡迎的。
即使您*在範圍內查看對象*,訪問說明符的作用相同。你使用'Base'引用,這就是她寫的全部內容。 – StoryTeller