深入剖析C++成員權限問題。

一,C++中的類成員訪問權限;
1,分類:
public:         具有這個訪問控制級別的成員是完全公開的,任何環境下都可以通過對象訪問這個成員  
private:       具有這個訪問控制級別的成員是完全保密的,即只能通過指向當前類(不包括派生類)的  
                        this   指針纔可以訪問,其它環境均無法直接訪問這個成員  
protected:   具有這個訪問控制級別的成員是半公開的:外界無法直接訪問這個控制級別的成員,但是派生類的   this   指針可以獲得訪問能力。  

2,C++中的默認權限是:
class是private
class中的成員的缺省權限也是private!
3,類的訪問權限是針對於類而言的,如果是同一個類的話,名字空間相同。那麼其中的相同的類的對象可以按照this指針操縱其中的成員。
eg:
class Test{
  public:
    Test();
    Test(Test *t); //拷貝構造函數!
  private:
    int a;       
};
Test::Test(Test *t)
{
  a=t->a; //直接訪問其中的私有,類似this指針!
}

二,C++中類的繼承對成員訪問權限的影響以及各種繼承的權限關係!

1,C++中A類繼承B類意味着A類中含有B類的所有成員,當然由於權限的緣故並不能那麼順利的訪問他們就是了。

2,各種繼承關係導致的訪問權限的改變。

1)缺省情況的繼承方式是private繼承當然這並不是我們所應該的一個設計!所以應該要注意不要隨意的用缺省的繼承方式!

2) public 繼承:
基類中的成員在派生類中的權限變化是: public--> public. protected-->protected.  private-->不可訪問!3)       

3)protected繼承:
權限變化是: public-->protected, protected-->protected。 private-->不能訪問

4)private繼承:
權限變化: public-->private, protected-->private,private-->不能訪問。
PS:
a,其中權限發生變化的指的就是在派生類中可以通過this指針讀取,但是他對於外界而言的權限發生相應的變化!
b,而其中的不能訪問就是指在派生類當中即使是this指針也無法訪問了!
c,歸納一點就是說,private的成員在派生類中不具備可訪問性,而protectd跟public的成員則根據相應的繼承方式而在派生類中的權限發生相應的變化。public不變,protected繼承編程protectd,private全部編程private!
d,多層次的繼承則按照這個規律遞推...
例題:

class Base
{
public:
  int m1;
protected:
  int m2;
private:
  int m3;
};

class PrivateClass:private Base
{
//m1,m2變成私有,m3不可訪問
public:
  void Test()
  {
    m1=1;
    m2=2;
    m3=3;//不可訪問   }
};

class DrivedFromPri:public PrivateClass
{
//m1,m2不可訪問,m3繼續保持不可訪問
public:
  void Test()
  {
    m1=1;//不可訪問
    m2=2;//不可訪問
    m3=3;//不可訪問
  }
};

class ProtectedClass:protected Base
{
//m1,m2變成受保護數據,m3不可訪問 public:
  void Test()
  {
    m1=1;
    m2=2;
    m3=3;//不可訪問
    }
};

class DerivedFromPro:public ProtectedClass
{
//m1,m2繼續爲保護的,m3不可訪問
public:
  void Test()
  {
    m1=1;
    m2=2;
    m3=3;//不可訪問
    }
};

class PublicClass:public Base
{
//m1公有,m2受保護,m3不可訪問
public:
  void Test()
  {
    m1=1;
    m2=2;
    m3=3;//不可訪問
  }
};

class DerivedFromPub:public PublicClass
{
//m1保持公有,m2保持受保護,m3保持不可訪問
public:
    void Test()
    {
    m1=1;
    m2=2;
    m3=3;//不可訪問     }
};

void main()
{
PrivateClass priobj;//m1,m2,m3都不可訪問
priobj.m1=1;//不可訪問
priobj.m2=2;//不可訪問
priobj.m3=3;//不可訪問

ProtectedClass proobj;//m1,m2受保護,m3不可訪問
proobj.m1=1;//不可訪問
proobj.m2=2;//不可訪問
proobj.m3=3;//不可訪問

PublicClass pubobj;//m1公有,m2受保護,m3不可訪問
pubobj.m1=1;
pubobj.m2=2;//不可訪問
pubobj.m3=3;//不可訪問
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章