深入剖析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;//不可訪問
}
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;//不可訪問
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.