三種繼承方式

官網快三註冊邀請碼88886486發表於2021-02-14

不同的繼承方式,主要區別在於基類中不同訪問許可權的成員在派生類中的訪問許可權變化情況。下面一一介紹。

先來說說公有繼承,公有繼承的模式下,特點如下:

  1. 基類中的公有成員,在派生類中仍然為公有成員。當然無論派生裡的成員函式還是派生類物件都可以訪問。

  2. 基類中的私有成員,無論在派生類的成員還是派生類物件都不可以訪問。

  3. 基類中的保護成員,在派生類中仍然是保護型別,可以通過派生類的成員函式訪問,但派生類物件不可以訪問!

第二種,私有繼承。

在私有繼承的情況下,公有型別、私有型別、受保護型別三種成員的訪問許可權如下:

  1. 基類的公有和受保護型別,被派生類私有繼承吸收後,都變為派生類的私有型別,即在類的成員函式裡可以訪問,不能在類外訪問。

  2. 而基類的私有成員,在派生類無論類內還是類外都不可以訪問。

可以看出來,如果為私有派生,則基類的私有成員在派生類甚至再派生出的子類中,都無法再使用。沒有什麼存在意義,故這種使用情況比較少。

第三種,保護繼承

保護型別的繼承,特點如下:

  1. 基類的公有成員和保護型別成員在派生類中為保護成員。

  2. 基類的私有成員在派生類中不能被直接訪問。

可以看的出來,派生類裡的成員函式可以訪問基類的公有成員和保護成員,但在類外通過派生類物件則無法訪問它們。同樣,無論派生類裡的成員函式還是通過類物件都無法訪問基類中的私有成員。

下面還是以時鐘和鬧鐘的程式程式碼為例,實驗基類中不同型別通過不同許可權派生的訪問問題。

對於公有型別,無論在派生類的成員方法裡還是類外都可以呼叫,編譯無錯執行如下:

111.png

但對於私有成員,我們試圖增加一行程式碼見41行。

我們試圖在派生類的成員函式中對吸收來自基類的H變數進行賦值,編譯得到報錯,見紅色方框與下方提示:

222.png

可以看到錯誤資訊“H為私有型別”。

而對於受保護型別的,我們嘗試在基類中定義一個protected型別的變數w,並試圖在公有繼承的派生類方法中賦值使用,可以看到下圖的情況,完全可以訪問。如下圖:

333.png

對於私有繼承,公開型別的成員在類外訪問情況:

444.png

大家可以自行上機實驗,驗證不同型別成員在公有繼承下的訪問情況。

學習並實驗過後,我們可以總結如下:

  1. 基類私有成員,無論什麼派生許可權,派生類內成員函式和類外都是不可以訪問的。

  2. 私有繼承,無論基類原來什麼型別,在派生類外通過成員函式都不可以訪問。

  3. 派生類從基類中吸收的成員的訪問許可權為基類中訪問許可權和派生時派生許可權兩者之中最低的一種。

並根據派生的許可權、基類中定義的許可權,在派生類的類內和類外不同訪問時的組合情況,列出下表:

公有繼承 保護繼承 私有繼承 訪問位置 類內 類外 類內 類外 類內 類外 公有成員 可以 可以 可以 不可以 可以 不可以 保護成員 可以 不可以 可以 不可以 可以 不可以 私有成員 不可以 不可以 不可以 不可以 不可以 不可以

相關文章