(1) 對基類成員和子物件成員的初始化必須在成員初始化列表中進行,新增成員的初始化既可以在成員初始化列表中進行,也可以在建構函式體中進行。
(2) 派生類建構函式必須對這三類成員進行初始化,其執行順序如下所述。
. 呼叫基類建構函式;
. 呼叫子物件的建構函式;
. 派生類的建構函式體;
(3) 當派生類有多個基類時,處於同一層次的各個基類的建構函式的呼叫順序取決於定義派生類時宣告的順序(自左向右),而與在派生類建構函式的成員初始化列表中給出的順序無關。
(4) 如果派生類的基類也是乙個派生類,則每個派生類只需負責其直接基類的構造,依次上溯。
(5) 當派生類中有多個子物件時,各個子物件建構函式的呼叫順序也取決於在派生類中定義的順序(自前至後),而與在派生類建構函式的成員初始化列表中給出的順序無關。
(6) 派生類建構函式提供了將引數傳遞給基類建構函式的途徑,以保證在基類進行初始化時能夠獲得必要的資料。因此,如果基類的建構函式定義了乙個或多個引數時,派生類必須定義建構函式。
(7) 如果基類中定義了預設建構函式或根本沒有定義任何乙個建構函式(此時,由編譯器自動生成預設建構函式)時,在派生類建構函式的定義中可以省略對基類建構函式的呼叫,即省略」《基類名》(《參數列》)」。
(8) 子物件的情況與基類相同。
(9) 當所有的基類和子物件的建構函式都可以省略時,可以省略派生類建構函式的成員初始化列表。
(10) 如果所有的基類和子物件建構函式都不需要引數,派生類也不需要引數時,派生類建構函式可以不定義。
class a
; a::~a()
class b : public a
; b::~b()
1)a 基類析構函式未加virtual,
執行「a *pa = newb();delete pa; 」,輸出「delete a」;
執行「b *pa = newb();
delete pa; 」,輸出「delete b delete a」;
2)a 基類析構函式加virtual修飾,
執行「a *pa = newb();
delete pa; 」,輸出「delete b delete a」;
執行「b *pa = newb();
delete pa; 」,輸出「delete b delete a」;
a 基類析構函式未加virtual,因此不會呼叫子類析構 基類與派生類
初學c 的時候,很多人都很頭疼各種訪問標號下基類與派生類的關係,其實,死記硬背肯定不是乙個好的辦法,要知道它們之間的關係,先要分析一下訪問標號是如何產生的 在沒有繼承之前,類的只有兩類使用者 類本身和類的使用者。把類成員通過public和private劃分恰好體現了這一分割 類的使用者只能訪問類的p...
理解C 基類與派生類
通過繼承機制,可以利用已有的資料型別來定義新的資料型別。所定義的新的資料型別不僅擁有新定義的成員,而且還同時擁有舊的成員。我們稱已存在的用來派生新類的類為基類,又稱為父類。由已存在的類派生出的新類稱為派生類,又稱為子類。在c 語言中,乙個派生類可以從乙個基類派生,也可以從多個基類派生。從乙個基類派生...
基類與派生類的轉換
一 基類與派生類的轉換 3種繼承方式 公用 保護 私有繼承 中,公用派生類才是基類真正的子型別,它完整地繼承了基類的功能。不同型別資料之間在一定條件下可以進行型別的轉換。基類與派生類物件之間是否也有賦值相容的關係,可否進行型別間的轉換?回答是可以的。基類與派生類物件之間有賦值相容關係,由於派生類中包...