[C++] 訪問控制與繼承詳解
阿新 • • 發佈:2018-12-28
1、
訪問控制中有三種角色:基類及其友元,派生類,類使用者(物件);
訪問說明符分為public/protected/private,類的成員也相應的分為了3種。
2、
訪問說明符又分為兩種:一個是基類中的成員訪問說明符;另一個是派生類派生列表中的訪問說明符。
3、以上兩種訪問說明符把
類的成員分成了分為了6種:派生類中的public/protected/private成員;派生類的public/protected/private基類及其成員。
4、接下來我們梳理一下三種角色對上述成員的訪問許可權。
4.1 我們假設只有一個基類 ,那麼它的成員有public/protected/private三種。訪問關係如下表:(有許可權簡稱有,無許可權簡稱無)
具體來說就是:1)基類本身及其友元對基類中任何成員都有訪問許可權;
2)派生類及派生類的友元可以通過派生類的物件訪問基類中受保護的成員,對private成員無訪問許可權;
3)
類使用者(由基類定義的物件)只能訪問基類中的public成員。
4.2 加上派生列表中的訪問說明符之後,訪問的成員加上了派生類的基類,然後,我們看訪問許可權有什麼變化?
1)派生列表後的訪問說明符相當於說明了基類屬於派生類的成員型別,舉個例子來說,Class D:public B,那麼基類B就相當於D中的public成員,但是需要注意的一點就是,基類中的成員仍然受到基類中的訪問說明符的控制,也就是說,儘管B是public的,但是B中的private成員D仍然沒有許可權進行訪問。
2)因為類及其友元可以訪問本身所有資料成員,所以派生訪問說明符對於派生類的成員(及其友元)能否訪問其直接基類的成員沒有什麼影響;所造成的不同點就在於派生類的派生類和派生類的物件訪問許可權會有所不同,這時候可以
把基類看作是派生類中的成員。
總結起來就有如下表:
5、派生類向基類轉換的可訪問性:能否轉換的關鍵就是基類的公有成員是否對派生類的某種角色(派生類及其友元、派生類的使用者,派生類的派生類及其友元)是否是可訪問的,如果可以訪問,就可以轉換;換句話說,
如果當前的角色能夠使用基類中的公有成員,那麼就是可以轉換的。
6、關於友元:
1)友元關係不能繼承,是基類的友元,如果不宣告的話,就不是派生類的友元,也就不能訪問派生類的成員。
2)基類的友元可以訪問基類中的成員以及派生類中的基類部分。
7、當然成員的可訪問性也不是一成不變的,使用using宣告就可以改變其訪問性,但是還受到成員訪問說明符的制約。
8、struct和class的唯一區別就在於預設的訪問許可權不同,最好還是顯示宣告訪問許可權。
public成員 | protected成員 | private成員 | |
基類及其友元 |
有 |
有 | 有 |
派生類及其友元 | 有 | 有 | 無 |
類使用者 | 有 | 無 |
無 |
派生類public | 派生類protected | 派生類private | public基類 | protected基類 | private基類 | |
派生類及其友元 | 有 | 有 | 有 | 無影響 | 無影響 | 無影響 |
派生類的派生類及其友元 | 有 | 有 | 無 | 無影響 | 無影響 | 無 |
派生類使用者 | 有 | 無 | 無 | 無影響 | 無 | 無 |