知識點:三種屬性,using改變許可權,繼承時名字的遮蔽,函式過載的遮蔽問題,派生類的建構函式,多繼承類,命名衝突,虛繼承,多繼承的建構函式,
在基類中,基類的public,protected ,private 成員都是可以訪問的,但是類的物件只能訪問public成員
public繼承: 基類的public成員,在派生類中依舊是public屬性,派生類的物件可訪問以訪問;
基類中的private成員,在派生類中是private屬性,派生類中的物件不可以訪問;派生類中也不可以訪問;
基類中的protected成員,在派生類中是protected屬性,派生類的物件中不可以訪問,派生類中是可以訪問基類的protected成員的;
private繼承:基類中的public成員,在派生類中是private屬性;在派生類物件中是不可以訪問;基類中public變成派生類中private, 在派生類中是可以訪問的;
基類中private成員,在派生類中是private屬性,在派生類和派生物件中都是不可以訪問的;
基類中protected成員,在派生類中是private屬性,在派生類中是可以訪問的,在派生類的物件中是不可以訪問的;
protected繼承: 基類中public成員,在派生類中是protected屬性,在派生類中是可以直接訪問,在派生類物件中無法訪問;
。。。protected 成員,在派生類中protected屬性,在派生類中可直接訪問,在派生類物件中不能訪問;
基類中private成員,在派生類中private屬性,在派生類中無法訪問,派生類物件無法訪問;
小結:基類中的private的成員,不管何種繼承方式,在派生類和派生物件中都是不可以訪問的;
基類中的protected成員,不管何種繼承方式,在派生類中都是可以訪問的,在派生類的物件中都是不可以訪問的;
基類中的public成員只有是public繼承才能在派生類的物件中訪問,當是protected或者private繼承時,只能在派生類中訪問;
2.要是派生類想要通過基類中的非private函式訪問基類中的private成員,而基類中沒有非private函式的時候就只能使用using來在派生類中改變基類在派生類中的許可權
使用using改變使用許可權;
using可以把public改變成private,protected;
using可以把protected改變成private,public
using不可以改變private的屬性
3.繼承中不存在過載,只要派生類自己的函式(或者變數)和繼承過來的基類函式(或者變數)名字相同的時候,不管型別如何都會發生遮蔽;
4.繼承時的記憶體模型
派生類中的記憶體時:基類中的變數所佔的空間 ++++ 派生類自己的變數的記憶體空間;
而所有成員函式仍然儲存在另外乙個區域——**區,由所有物件共享
5派生類的建構函式
基類的建構函式不能被繼承,同時也不能被當成派生類的普通函式進行呼叫,呼叫基類的建構函式的時候,函式()內寫的是傳入的實參,不需要加型別如int,float之類的;
當派生類中需要對基類的private成員繼承初始化,但是基類中卻沒有可以呼叫private成員的函式,這時候就需要在派生類中呼叫基類的建構函式;
派生類建構函式中只能呼叫直接基類的建構函式,不能呼叫間接基類的
也可以將基類建構函式的呼叫放在引數初始化表後面:
student::student(char *name, int age, float score): m_score(score), people(name, age)
但是不管它們的順序如何,派生類建構函式總是先呼叫基類建構函式再執行其他**(包括引數初始化表以及函式體中的**)
6基類的析構函式也不能被繼承
7多繼承的時候,繼承是有順序的如:
class d:public a,public b,public c( )
先繼承a的內容,再繼承b的內容,最後繼承c的內容
8命名衝突
當派生類繼承的多個基類中有函式名相同,這時候就是命名衝突,編譯器會報錯
這是後就需要對衝突的函式加上域解析符,顯式地指明到底使用哪個類的成員,消除二義性。
9虛繼承,在繼承方式前面加上 virtual 關鍵字就是虛繼承:也可以消除命名衝突;不論虛基類在繼承體系**現了多少次,在派生類中都只包含乙份虛基類的成員。
class b: virtual public a
在最終派生類 d 的建構函式中,除了呼叫 b 和 c 的建構函式,還呼叫了 a 的建構函式,這說明 d 不但要負責初始化直接基類 b 和 c,還要負責初始化間接基類 a。
普通繼承中:派生類的建構函式只負責初始化它的直接基類,再由直接基類的建構函式初始化間接基類,使用者嘗試呼叫間接基類的建構函式將導致錯誤。
現在採用了虛繼承,虛基類 a 在最終派生類 d 中只保留了乙份成員變數 m_a,如果由 b 和 c 初始化 m_a,那麼 b 和 c 在呼叫 a 的建構函式時很有可能給出不同的實參,這個時候編譯器就會犯迷糊,不知道使用哪個實參初始化 m_a。
c++ 乾脆規定必須由最終的派生類 d 來初始化虛基類 a,直接派生類 b 和 c 對 a 的建構函式的呼叫是無效的
建構函式的執行順序:
虛繼承時建構函式的執行順序與普通繼承時不同:
1.在最終派生類的構造函式呼叫列表中,不管各個建構函式出現的順序如何,編譯器總是先呼叫虛基類的建構函式,再按照出現的順序呼叫其他的建構函式;
2.對於普通繼承,就是按照建構函式出現的順序依次呼叫的。
學習python第四節課
基礎資料概念 資料型別指的就是變數的值的型別,也就是可以為變數賦哪些值 整數和小數 整數 所有整數 例如 a 1 b 100 c 999 都是int型別 小數常量 所有小數 例如 a 1.2 b 6.66 用float型別表示 字串是由數字 字母 下劃線組成的一串字元 注意 單引號和雙引號不能混合使...
軟體測試第四節課總結
1 netware 作業系統 工業網際網路 基於文字介面 沒趕上圖形介面 被淘汰 windows基於tcp ip,剛開始不穩定,但搶占了先機,靠使用者反饋資訊,現在ubuntu走的就是這條路 2 黑盒測試方法 邊界值 等價類劃分 正交測試 對偶組合測試 因果圖測試 白盒測試 塊測試 語句覆蓋 判定覆...
嵌入式第四節課心得
一 偵錯程式gdb 1 gun計畫的工具 核心除錯kgdb 2 程式的錯誤分類 編譯時錯誤 語法錯誤 執行時錯誤 記憶體錯誤,邏輯錯誤 3 gdb的功能 a 執行程式 b 設定斷點 c 檢視變數值 4 hello.c gcc g hello.c hello gdb hello 5 使用 tui la...