在上一節(jié)中,我們看到了派生類的定義方法,用到了public的公有繼承,實際這里一共有三種方式,分別是公有繼承、私有繼承、保護繼承。
不同的繼承方式,主要區(qū)別在于基類中不同訪問權(quán)限的成員在派生類中的訪問權(quán)限變化情況。下面一一介紹。
1. 公有繼承:
在公有繼承的模式下,其特點如下:
(1)基類中的公有成員,在派生類中仍然為公有成員,當(dāng)然無論派生里的成員函數(shù)還是派生類對象都可以訪問。
(2)基類中的私有成員,無論在派生類的成員還是派生類對象都不可以訪問。
(3)基類中的保護成員,在派生類中仍然是保護類型,可以通過派生類的成員函數(shù)訪問,但派生類對象不可以訪問。
2. 私有繼承:
在私有繼承的情況下,公有類型、私有類型、受保護類型三種成員的訪問權(quán)限如下:
(1)基類的公有和受保護類型,被派生類私有繼承吸收后,都變?yōu)榕缮惖乃接蓄愋?,即在類的成員函數(shù)里可以訪問,不能在類外訪問。
(2)而基類的私有成員,在派生類無論類內(nèi)還是類外都不可以訪問。
我們可以看出來,如果為私有派生,則基類的私有成員在派生類甚至再派生出的子類中,都無法再使用,沒有什么存在意義,故這種使用情況比較少。
3. 保護繼承:
保護類型的繼承,特點如下:
(1)基類的公有成員和保護類型成員在派生類中為保護成員。
(2)基類的私有成員在派生類中不能被直接訪問。
可以看的出來,派生類里的成員函數(shù)可以訪問基類的公有成員和保護成員,但在類外通過派生類對象則無法訪問它們。同樣,無論派生類里的成員函數(shù)還是通過類對象都無法訪問基類中的私有成員。
下面還是以時鐘和鬧鐘的程序代碼為例,實驗基類中不同類型通過不同權(quán)限派生的訪問問題。對于公有類型,無論在派生類的成員方法里還是類外都可以調(diào)用,編譯無錯運行如下:
但對于私有成員,我們試圖增加一行代碼見41行。在派生類的成員函數(shù)中對吸收來自基類的H變量進行賦值,編譯得到報錯,見紅色方框與下方提示:
可以看到錯誤信息“H為私有類型”。
而對于受保護類型的,我們嘗試在基類中定義一個protected類型的變量w,并試圖在公有繼承的派生類方法中賦值使用,可以看到下圖的情況,完全可以訪問。如下圖:
對于私有繼承,公開類型的成員在類外訪問情況:
大家可以自行上機實驗,驗證不同類型成員在公有繼承下的訪問情況。
學(xué)習(xí)并實驗過后,我們可以總結(jié)如下:
1. 基類私有成員,無論什么派生權(quán)限,派生類內(nèi)成員函數(shù)和類外都是不可以訪問的。
2. 私有繼承,無論基類原來什么類型,在派生類外通過成員函數(shù)都不可以訪問。
3. 派生類從基類中吸收的成員的訪問權(quán)限為基類中訪問權(quán)限和派生時派生權(quán)限兩者之中最低的一種。
并根據(jù)派生的權(quán)限、基類中定義的權(quán)限,在派生類的類內(nèi)和類外不同訪問時的組合情況,列出下表:
公有繼承 | 保護繼承 | 私有繼承 | ||||
訪問位置 | 類內(nèi) | 類外 | 類內(nèi) | 類外 | 類內(nèi) | 類外 |
公有成員 | 可以 | 可以 | 可以 | 不可以 | 可以 | 不可以 |
保護成員 | 可以 | 不可以 | 可以 | 不可以 | 可以 | 不可以 |
私有成員 | 不可以 | 不可以 | 不可以 | 不可以 | 不可以 | 不可以 |
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程