前言:
public、protected、private 這三個權限修飾字既可以用來修飾成員變量和成員函數,也可以用來修飾繼承類型。下面將討論繼承類型。
成員變量和成員函數的訪問權限:
- 派生類對基類成員的訪問權限,與是public 、 protected 、 private繼承類型沒關係,僅僅與基類中成員的權限屬性有關係:
- 派生類能訪問基類的public和protected成員,不能訪問private成員。
繼承權限是用來控制 “派生類的使用者” 對基類成員的訪問權限:
這裏涉及到兩個概念:
- 派生類對基類成員的訪問權限
- 派生類使用者對基類成員的訪問權限
類成員的使用者有三種:
- 自己的其他成員,比如成員函數可以使用成員變量,不管成員變量是什麼權限,注意,這裏的使用僅限在這個類的實現中,通過類實例來訪問,這屬於類使用者的訪問,而不是類自身的訪問
- 派生類,派生類的實現(成員函數、成員變量)能夠訪問它基類的protected和public成員
- 派生類的派生類(孫類) 和 其他類,如果派生類是public繼承基類的,那麼這兩種類都可以“ 通過多態 ”直接訪問基類的public成員。如果是private的,那麼無論如何都不能 “ 通過多態 ”直接訪問基類的任何成員,包括public的,當然,你可以直接通過基類指針來訪問。
目前已知場景有兩個:
通過private繼承,來控制孫類對基類的成員訪問。
private繼承可以理解爲:可傳家產(public)到兒子輩就被截住了,孫子輩用不到爺爺輩的東西。
public繼承可以理解爲:可傳家產(public)兒子輩一點沒動,孫子輩可以接這用爺爺輩的東西。即:哪一層繼承做了private限制,對上一層的訪問就在哪一層停止,後續的繼承都沒法突破這層限制。
每一層只能控制自己下一層對自己上一層的訪問,而自己永遠都能夠訪問上一層的public東西。
通過private繼承,來控制類使用者通過基類指針指向派生類。
例:
class A{
...
}
class B:private A{
...
}
main{
A* pa;
B b;
pa = &b; //如果是private繼承,則詞句編譯不過,public繼承就可以
//因爲這裏是main函數這麼一個類使用者試圖通過派生類指針來訪問基類成員
//同理,如果這裏不是main函數,而是類外一個類C,同樣也允許,因爲他們
//對於 A 和 B來說都是使用者。
}
小結:
1)成員變量的權限,是用來控制 子類 和 使用者對自己成員的訪問。
2)繼承權限,是用來控制 自己的子類 對 自己的父類 的 “”“”public”““”成員的訪問,注意這裏說的是public成員,因爲無論如何都無法訪問private成員。
可以簡單理解爲:
“ 使用哪種繼承,就會把基類的public成員變成自己的 哪種成員 ,而 類使用者 和 繼承自己的 的類只需要依舊按照成員訪問權限來訪問自己即可 ”