1. 程式人生 > 其它 >C++類的訪問許可權

C++類的訪問許可權

首先明確一個類的使用者有三種:

  1. 一類使用者:類的成員和友元,訪問許可權最高
  2. 二類使用者:派生類的成員及派生類的友元
  3. 三類使用者:外部的使用者程式碼

一個類有三種成員

  1. private:只有一類使用者可以訪問private成員。
  2. protected:只有一、二類使用者可以訪問protected成員。
  3. 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的publicprotected成員,類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的
}