C++類的訪問許可權
阿新 • • 發佈:2022-05-24
首先明確一個類的使用者有三種:
- 一類使用者:類的成員和友元,訪問許可權最高
- 二類使用者:派生類的成員及派生類的友元
- 三類使用者:外部的使用者程式碼
一個類有三種成員
- private:只有一類使用者可以訪問
private
成員。 - protected:只有一、二類使用者可以訪問
protected
成員。 - public:所有使用者都可訪問
針對二類使用者訪問protected成員有一點說明:對於一個派生類物件,只能通過派生類去訪問基類的protected成員,而不能通過基類去訪問。
class A { protected: int a; }; class B : A { void f() { A *p = this; int c = p->a;//錯誤,p是基類指標,不能通過基類訪問受保護成員 int d = this->a;//正確 } };
派生訪問說明符
僅影響派生類的二三類使用者對基類成員的訪問。預設情況下,類B的二類使用者(C的一類使用者)可以訪問A的public
和protected
成員,類B的三類使用者可以訪問A的public
成員。但新增派生訪問說明符會可能縮小B的二三類使用者訪問基類成員的許可權。
class A { public: int a; protected: int b; }; class B : private A {}; class C : B { void f() {cout << b;} //錯誤,B是private繼承A,若是protected或者public繼承,則正確。 } int main() { B b; cout << b.a;//錯誤,只有B是public繼承A才正確。 }
派生訪問說明符還影響使用者操作派生類向基類的轉換,但不影響派生類成員和友元進行型別轉換。tip:如果某個節點可以通過派生類對基類的公有成員進行訪問,那就可以進行派生類到基類的型別轉換。
class A{};
class B : protected A {
void f()
{
A *p = this;//正確
}
};
int main()
{
B b;
A *p = &b;//錯誤,類B是protected繼承A的
}