呼叫基類的建構函式,呼叫順序按照他們被繼承時宣告的順序從做到又繼承。
執行結果如下:
看到了沒,多個基類建構函式的執行順序是由最開始的繼承列表中的宣告順序決定的:
class derived : public base2,public base1,public base3
另外,我們也可以看到,派生類中的成員變數的初始化順序也是按照他們在類中的宣告的順序來的。
派生類的建構函式要負責給基類的建構函式傳引數,這是毫無疑問的;派生類的拷貝建構函式也要給基類的拷貝建構函式傳引數。
和建構函式不同的地方在於,拷貝建構函式的引數只能有乙個:派生類物件的引用。那麼怎麼去給基類的拷貝建構函式傳引數?
我們知道公有派生的派生類物件可以當做基類物件使用的,這叫向上轉型。所以直接把派生類的物件的引用傳給基類去。
c:c(const c &c1):b(c1)
析構函式不會繼承,需要派生類自行宣告;
不需要顯示的呼叫基類的析構函式,系統會自動隱式呼叫。
派生類中的同名成員會對基類中的同名成員進行覆蓋,如果要通過派生類物件訪問基類中被隱藏的同名成員,應使用基類名限定。
但是如果從多個基類中繼承來的多個同名成員沒有在派生類中被隱藏的話,派生類在呼叫的時候就就不知道用哪個。
這也就是二義性問題:
解決二義性的方法:
用類名來限定c1.a::f()或c1.b::f()
同名隱藏
關於虛繼承:
如果兩個類都繼承了同乙個基類,另乙個類同時繼承了這兩個類,形成了乙個閉環。那麼在這個派生類中會從兩條路徑繼承來兩份最初基類中的成員:
此時可以讓這兩個類虛繼承。虛繼承通過增加乙個指標,來間接訪問基類資料:
繼承與派生(二)
一 有子物件的派生類的構造 子物件 類的資料成員中包含的類的物件 派生類建構函式的任務 對基類資料成員的初始化 對子物件資料成員的初始化 對派生類資料成員的初始化 派生類建構函式的一般形式 派生類建構函式名 總參數列列 基類建構函式名 參數列列 子物件名 參數列列 二 有子物件的派生類的構造 派生類...
C 繼承與派生
派生新類 吸收已有類的成員 調整已有類成員和新增新的成員 class 派生類名 繼承方式 基類名1,繼承方式 基類名2,派生類成員宣告 繼承方式有 public protected private 預設 公有繼承 基類的公有和保護乘員的訪問屬性在派生類中不變,基類的私有成員不能直接訪問 型別相容規則...
c 繼承與派生
繼承 與派生 一 派生方式的不同的表現 1 派生類在類內成員對基類成員 的訪問許可權 2 派生類的物件對基類成員的訪問許可權。二 公有繼承 1 基類protected和public的成員在派生類中訪問屬性保持不變 2 基類的private成員在派生類中不可訪問。3 派生類的成員 即派生類內 可以直接...