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

時義龍發表於2021-01-04

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更安全
物件模型-多型實現原理分析及物件大小
案例實現
通訊錄

相關文章