嵌入式c 軟體開發筆記第三講

2021-10-13 20:51:57 字數 3120 閱讀 8078

c++繼承

**重用

組合(has-a)

a類裡含有b類的成員

繼承(is-a)

class 派生類名:繼承方式 基類名

繼承是使用已經編寫好的類來建立新類,新的類具有原有類的所有屬性和操作,也可以在友元類的基礎上做一些修改和增補。

新類稱為派生類或子類,原有類稱為基類或父類

派生類是基類的具體化

繼承規則

公有繼承:

基類的公有成員和保護成員在派生類中保持原有訪問屬性,其私有成員仍為基類的私有成員。

public 作用:傳承介面間接的傳承了資料(protected)。

派生類派生類的組成

一類是從基類繼承過來的(共性),一類是自己增加的成員(個性)。

派生類的建構函式(執行順序)

基類繼承而來的成員的初始化工作還是由基類建構函式完成,派生類新增的成員在派生類的建構函式中初始化。

派生類建構函式執行的次序

基類–>成員物件–>子類

基類中沒有預設建構函式(無參),那麼在派生類的建構函式中必須顯示呼叫基類建構函式,以初始化基類成員。

呼叫基類建構函式,呼叫順序按照它們被繼承時宣告的順序(從左到右);

呼叫內嵌成員物件的建構函式,呼叫順序按照它們在類中宣告的順序;

派生類拷貝建構函式(呼叫傳參)

派生類::派生類(const 派生類& another):基類(another),派生類新成員(another.新成員)

派生類中的預設拷貝構造器會呼叫父類中預設或自實現拷貝構造器

若派生類中自實現拷貝構造器,則必須顯示的呼叫父類的拷貝構造器。

派生類拷貝賦值運算子(顯示呼叫父類:private繼承的時候)

派生類可繼承、可過載

派生類拷貝賦值運算子中顯示呼叫,無則隱式呼叫

派生類的友元函式(不能繼承,但是通過強制型別轉化)

友元函式並非類成員,因引不能被繼承

派生類訪問基類的友元函式:將派生類的指標或者引用強制轉化為基類指標或者引用

派生類的析構函式(執行順序)

析構函式的執行順序與建構函式相反。

子類->成員物件->基類

派生類成員函式

函式過載

函式遮蔽

派生類成員函式與基類成員函式一摸一樣–預設呼叫派生類的方法

通過派生類物件訪問基類的同名函式 物件名.基類名::函式名

多繼承多繼承語法:class 派生類名: 訪問控制符 基類名1,訪問控制符 基類名2

多重繼承的二義性

虛基類和虛繼承機制,實現了在多繼承中只保留乙份共同成員,從而解決了多繼承導致的二義性問題

基類、派生類的轉換

c++向上轉型:類其實也是一種資料型別,也可以發生資料型別轉換,不過這種轉換只有在基類和派生類之間才有意義,並且只能將派生類賦值給基類,包括將派生類物件賦值給基類物件、將派生類指標賦值給基類指標、將派生類引用賦值給基類引用,這在 c++ 中稱為向上轉型(upcasting)。相應地,將基類賦值給派生類稱為向下轉型(downcasting)。

將派生類物件賦值給基類物件

將派生類指標賦值給基類

型別相容性原則

子類物件可以當作父類物件使用

子類物件可以直接賦值給父類物件

子類物件可以直接初始化父類物件

父類指標可以直接指向子類物件

父類引用可以直接引用子類物件

c++多型

多型定義:

所謂的多型(polymorphism)是指,由繼承而產生的相關的不同的類,其物件對同一訊息會作出不同的響應。

作用:能增加程式的靈活性。可以減輕系統公升級,維護,除錯的工作量和複雜度.–提高**的擴充套件性

多型形成的條件

父類中有虛函式。

子類override(覆寫)父類中的虛函式。

通過己被子類物件賦值的父類指標或引用,呼叫共用介面

虛函式注意事項

1.基類中用virual 宣告成員函式為虛函式。類外實現虛函式時,不必再加virtual.

2.在派生類中重新定義此函式稱為覆寫,要求函式名,返值型別,函式引數個數及型別全部匹配

3.為了避免在派生類寫錯虛函式,可在派生類裡的虛函式中新增override修飾,確保該函式為虛函式並覆寫來自基類的虛函式。

若干限制

只有類的成員函式才能宣告為虛函式

靜態成員函式不能是虛函式

內聯函式不能是虛函式

建構函式不能是虛函式

析構函式可以是虛函式且通常宣告為虛函式。

為什麼將基類析構函式定義為虛析構函式?

當你可能通過基類指標刪除派生類物件時

純虛函式

定義:virtual 函式名(形參) = 0;

純虛函式只有宣告,沒有實現,被「初始化」為0。

抽象類定義:含有純虛函式的類,稱為抽象基類,不可實列化。即不能建立物件

作用(介面):被繼承,提供族類的公共介面

注:純虛函式,而在派生類中沒有對該函式定義,則該虛函式在派生類中仍然為純虛函式,派生類仍然為純虛基類。

執行時型別資訊(rtti)

運算子typeid

1.運算子typeid 返回包含運算元資料型別資訊的type_info 物件的乙個引用,資訊中包括資料型別的名稱

2.其中type_info 過載了操作符==, !=,分別用來比較是否相等、不等,函式name()返回型別名稱

3.type_info 的拷貝和賦值均是私有的,故不可拷貝和賦值

多型下使用typeid 時要注意的問題:

1.確保基類定義了至少乙個虛函式(虛析構也算)。

2.不要將typeid 作用於指標,應該作用於引用,或解引用的指標。

3.type_info 型別,其拷貝建構函式和賦值運算函式都宣告為private 了,這意味著其不能用於stl 容器

dynamic_cast

作用1.若對指標進行dynamic_cast,失敗返回null,成功返回正常cast後的物件指標;

2.若對引用進行dynamic_cast,失敗丟擲乙個異常,成功返回正常cast後的物件引用。

在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;

在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全

物件模型-多型實現原理分析及物件大小

案例實現

通訊錄

嵌入式c 軟體開發筆記 第六講

對檔案進行讀寫操作 讀檔案operator int get istream get int istream get char int n,char deli istream getline char int n get vs getline get 和getline 最大的區別就是,get 遇到界定...

嵌入式 linux第三講 儲存管理實驗

cpu 通過儲存管理器 訪問記憶體 sdram 和網絡卡 等等外設 例如 cpu 讀取 位址0x30000000 位址上的資料 讀取4位元組 move r1 30000000 ldr r0 r1 這樣cpu讀取4位元組的資料 儲存管理器 根據外設的 a 片選訊號吧 b bank 選擇訊號 c列位址 ...

嵌入式軟體開發流程

1 嵌入式軟體開發流程在整個流程中,使用者首先需要建立工程並對工程做初步的配置,包括配置處理器和配置除錯裝置。編輯工程檔案,包括自己編寫的彙編和c語言源程式,還有工程編 譯時需要編寫的鏈結指令碼檔案,除錯過程中需要編寫儲存區映像檔案和命令指令碼檔案,以及上電復位時的程式執行入口的啟動程式檔案。對後四...