C 繼承詳解

2021-10-12 04:56:31 字數 3891 閱讀 4648

目錄簡介

通過示例引出繼承的作用

如何解決此類冗餘問題 —— 使用繼承

繼承的思想:

提取共性:

封裝到乙個類:

**中實現繼承

實現繼承後的關係如下圖:

繼承後的能力

繼承的特性

1.繼承的單根性:

2.繼承的傳遞性:  

繼承被後的秘密 —— 子類和父類的建構函式(難點)

嘗試執行:

為什麼會提示報這個錯誤?意思說父類不能沒有乙個無參的建構函式。

根據此特徵我們可以推測子類和父類的建構函式一定有關係,但一定不是繼承關係

子類會首先去預設執行父類的無參建構函式,然後在執行自己的建構函式

但是子類又為什麼要先去執行父類的建構函式?

總結:在子類中使用顯示呼叫父類建構函式

作用1:

作用2:

子類中存在和父類中相同的成員

指定new關鍵字:

其他注意點

繼承(封裝、多型)是物件導向程式設計三大特性之一,繼承的思想就是擯棄**的冗餘,實現更好的重用性。

繼承從字面上理解,無外乎讓人想到某人繼承某人的某些東西,乙個給乙個拿。這個語義在生活中,就像家族繼承財產,爺爺將財產繼承給兒女,兒女在將財產繼承給子孫,有些東西可以繼承有些的東西只繼承給某人。對映到程式設計當中,其思想也大致如此。

在**中定義個三個類:cat貓、dog狗、cattle牛。

從類圖上可以看出紅色標識區域,三個類的定義出現了大量的冗餘(字段、屬性、方法),那麼在編寫**時就會出現大量的重複**。

pig豬、panda熊貓、sheep羊......等等。這些類同樣會有相同的特徵:名稱、性別、年齡、奔跑(字段、屬性、方法)。

當我們定義了多個類,這多個類都存在重複的成員(共性)。我們可以將這些重複的成員單獨的提取封裝到乙個類中,作為這些具有相同特徵類的父類。

將此思想作用於上述的三個類

可以直**出重複的具有共性的專案有:1.欄位和屬性(年齡、姓名、性別)、2.方法(奔跑)。

如何定義這個類?cat貓、dog狗、cattle牛有明顯共同的特性,就是他們都是動物,故可以抽象定義乙個animal動物類。

}通過乙個簡單的  :(冒號)實現了繼承關係。

實現繼承後產生了兩個角色:1.子類(派生類)、2.父類(基類)

**中子類刪除父類提取的重複性成員。

實現繼承後每個子類僅保留了自己特有的特性,大大減少了冗餘。

子類的共性成員都被父類提取了,那麼子類要使用怎麼辦?

子類繼承父類後,將會隱式繼承父類的所有成員,但不包括建構函式。

在繼承後,訪問其父類成員,會受到訪問修飾符的限制。故,修飾為private的私有成員不會訪問到。

乙個子類只能有乙個父類,就好比乙個人只有乙個父親。

例如, classc 派生自 classb,並且 classb 派生自 classa,則 classc 會繼承在 classb 和 classa 中宣告的成員。

依次順序可以不斷向上取。

圖例:

給父類編寫了乙個建構函式,示例**如下:

學過建構函式的應該都會知道,類在沒有指定任何建構函式的情況下,程式缺省會指派乙個無參的建構函式。

上述的例子由於我們手動新增的那個建構函式,預設的建構函式就被清除掉了。

在暫且不知道原因的情況下,我們嘗試補全那個無參的建構函式,在進行生成**,此時編譯通過沒有報錯。

嘗試呼叫剛剛定義的父類無參建構函式,在呼叫列表並沒有顯示,只顯示了類自身的乙個無參建構函式。

證明了子類不能繼承父類的建構函式。

通過除錯**監視子類例項化物件的過程,看它到底和父類的建構函式發生了什麼。

通過除錯發現在建立子類物件時的**執行邏輯如下:

這條定論就很好的解釋了,為什麼在上述例子為什麼會出現的錯誤。

因為子類繼承了父類的成員,這一項描述只能說明子類擁有的權利,並不代表子類去執行了。

在原則上要使用類的成員,必須要通過類的例項物件去呼叫。所以子類要呼叫到父類的成員,就必須去通過呼叫

父類的建構函式,在子類的內部建立乙個父類的物件,以便自己去呼叫父類的成員。

子類始終要使用父類的乙個建構函式在自己內部建立乙個父類物件,為了呼叫父類的成員。

子類預設呼叫父類的無參建構函式,所以在顯示編寫乙個有參建構函式時導致父類沒有了無參建構函式,從而編譯出錯。

提高**重用性,子類無需在類中定義,直接使用父類的。

上述例子講過子類在例項化物件時會呼叫父類的預設無參建構函式,因為子類的目的就是通過父類建構函式建立乙個物件。

通過這樣顯示的呼叫,那麼在父類有沒有無參建構函式都沒什麼關係了。

示例:

根據vs給我們提示的訊息,我們可以看出,當**中存在子類的成員和父類的成員相同的時候,子類的成員將父類的成員隱藏了。

隱藏過後子類將無法訪問到父類的成員。如果是刻意為之,我們可以使用new 關鍵字顯示的說明,從而提高可讀性。

此時提示的波浪線已消除。

在c#中,所有的類都直接或間接的繼承自object類(當我們定義乙個類的時候,如果沒有給該類指定繼承乙個類,那麼這個類就繼承了object類)。

C 繼承知識詳解

c 的繼承與 c 等語言乙個重要的不同,就是只能從乙個類中繼承,這是開發者 在權衡了從多個類c 繼承的優勢與劣勢作出的結果。不過,可以從介面繼承。另外,繼承可傳遞。建構函式和析構函式不能被繼承。初始化基類 可以在派生類建構函式中新增初始化基類的 public class baseclass publ...

c 虛繼承詳解

include using namespace std class a class b public virtual a class c public virtual a virtual void t int main virtual void foo void int x a 很簡單 乙個虛表指標...

C 繼承,虛繼承 記憶體結構 詳解

目錄 class test1 private int num1 class test2 public test1 private int num2 void main test2記憶體結構 檢視記憶體發現父類在子類的上面 在原有的 基礎上增加了test3類 test3類繼承了 test2和test1...