c 入門學習筆記繼承

2021-04-12 21:29:18 字數 2870 閱讀 3676

***繼承,物件導向程式設計的上方寶劍,有了它上下通吃---skyala***

人(類)->父母(物件)->子女(繼承、多重繼承)->子孫(多型性)---哇,my god!多麼完美的曲線!

***********************************宣告*******************************

1. 繼承的概念及重要性

2. 基類

3. 派生類

4. 基類 vs 派生類

5. 多重繼承

6. 應用舉例

a. 構造、析構的呼叫順序、重定義函式 (tpoint.cpp) 

b. 多重繼承及物件、指標應用 全面解釋了此種關係(tobjpoi.cpp)

7. 問題(太多不明白了)

基類、派生類與指標、物件的關係

* 基、派指標可分別直接引用基、派物件 time * t,c; t=&c; t->(c中的成員)

* 基類指標可引用派生類物件,即派生類指標可直接賦給基類指標,引用的成員只能是基類部分

time * t;c2; t= &c2, t->c2(其內的基類成員)

* 派生類指標不能直接引用基類物件(型別的包容性不同),即基類指標不能直接賦給派生類指標。必先轉換:基類對基類,派生類對派生類或派生對基(同2).

time * t,c; time2 * t2,c2; t2 =&c(錯誤的). 

改變1:

t=&c;t2 = (time2 *)t 等價於t2 = (time2 *)&c 強制基類指標為轉換為派生類指標再賦給派生類 t = &c2;

改變2:t2 = (time2 *)&t 

總:基類指標包基、包派生類指標,自動轉換

派生類指標要進行轉換為基為或轉換派為同類的派指標

**********************************定義********************************

1. 繼承的概念及重要性

inheritance :是軟體重用的一種形式,將相關的類組織起來,並分亨其間的共通資料和操作行為。

最具吸引力的特點:新類可以從現有的類庫中繼承。提倡建立與現有的類有許多共性的新類來實現軟體的重用

能新增基類的所沒有的特點以及取代和改進從基類繼承來的特點

單重繼承形成樹狀層次結構,由基類和派生類構成了一種層次關係,繼承的層次在系統的限制範圍內是任意的。

繼承機制定義了父子關係

2.基類

* 父類定義了所有子類共通的對外介面和私有實現內容,父類被稱為基類

* 成員函式:

基類的私有成員只能被基類的成員函式和友元訪問

基類的受保護成員只能被基類及派生類的成員函式和友元訪問

* 繼承基類的方式

public公有繼承使用最多,公對公,受保護受保護,私不用 

protected:公、保護對保護, private :公、保護對私

3.派生類

* 新類繼承預定義基類的資料成員和成員函式,而不必重新編寫資料成員和成員函式,這種新類叫派生(derived)類

* 派生類永遠不能直接訪問基灶的私有成員

* 重定義函式 

派生類中無需繼承的功能及要擴充的基類功能可以重定義成員函式,但在派生類再呼叫基類的同名函式時要用到作用域運算子employee::print()

* 派生類的建構函式和析構函式

由於派生類繼承了基類的成員,所以在建立派生類的例項物件時,必須呼叫基類的建構函式來初始化派生類物件中的基類成員。可隱式的呼叫基類建構函式,也可在派生類的建構函式中通過給基類提供初始化值(成員初始化值列表)明確的呼叫建構函式

構造函式呼叫順序,先執行基類的建構函式->派生類的成員物件建構函式 ->派生類建構函式

析構函式呼叫順序正好相反。

++++++++++ 切記:派生類不繼承基類的建構函式、析構函式和賦值運算子,但派生類的建構函式和賦值運算子能呼叫基類的建構函式和賦值運算子

4.基類 vs 派生類

理解要點:可把基類和派生類都看成是一種型別如int

* 物件 

派生類的物件可作為基類的物件處理,也即定義的派生類物件time t 可以訪問基類的成員函式和受保護資料,派生類物件賦給基類物件也是合理的。反之則不行,基類的物件不能自動的成為派生類的物件,因為派生類有擴充基類的物件中有些沒有了

* 指標

派生類物件的指標可以隱式的轉換為基類的指標。也即派生類指標可直接賦給基類指標,反之則不行

但可以用顯式型別轉換把基類指標強制轉換為派生類指標,如要復引用該指標,要在轉換前首先應該把它指向某個派生類物件(因不能引用該物件中並不存在的派生類物件) 如char * c;(int *) c;

* 兩者關係 

直接用基類指標引用基類物件:time * t,c; * t= &c; * t 返回物件c的引用 t ->(成員)

直接用派生類指標引用派生類物件

用基類指標引用乙個派生類物件,但只能引用基類成員(在多型中很有用)

time * t, time2 c; * t = &c; * t 返回派生類的物件的引用, t ->(基類成員)

用派生類指標引用基類物件,絕對不行。必須先強制轉換為基類指標

time t, time2 * c; * c = &t, * c及 c->(成員)錯誤

time t, time2 * c; * c = (time *)c c-> (成員)正確

指標操作是利用箭頭成員選擇運算子來訪問成員的。

無論怎樣賦值,物件的引用一定要本物件有這個資料或成員函式--skyala

5. 多重繼承

* 乙個類可從多個基類派生而來,這種派生叫多重繼承。是一種圖狀層次結構(有向無環圖)。注:功能強大,但易引起二義性,使用雙目作用域為解決之一法

* 用法:乙個型別a,是型別b,也是型別c

* 冒號後(:)加公有基類列表 class t:public d,public c {}

C 繼承學習筆記

派生類從基類繼承了保護 protected 成員和公有 public 成員函式,但是繼承不了基類的過載建構函式。定義乙個如下基類 class counter counter operator counter n void reset int getcount int getnum counter c...

C 學習筆記 繼承

一 c 中的繼承方式會影響子類的對外訪問屬性 public 修飾的成員變數 方法 在類的內部 類的外部都能使用 protected 修飾的成員變數方法,在類的內部使用,在繼承的子類中可用 private 修飾的成員變數方法,只能在類的內部使用 二 private成員在子類中依然存在,但是卻無法訪問到...

c 學習筆記 繼承

虛基類 派生類繼承的時候使用virtual關鍵字繼承的基類。個人認為叫 虛繼承 更為具體直觀。使用虛基類可以消除由多繼承產生的二義性。派生類可以隱含的轉換為基類,反之則不行。可以使用using語句繼承基類的建構函式,預設情況不繼承基類的建構函式。在即有繼承又有組合的時候,建構函式的呼叫順序為 先呼叫...