派生類與繼承
(最終解釋權歸原文作者所有,侵權必究)
1、繼承是物件導向程式設計的重要特徵之一,通過繼承,可以實現**重用。在c++中,繼承就是利用已有的類,通過派生的方式產生新的類。新類不但繼承了已有類的屬性和方法,而且可以增加新的屬性和方法。
2、在c++中,可以在已有類的基礎上構建新類,這個新類繼承了已有類的屬性和方法。這個新定義的類稱為原有類的派生類或子類,而原有類稱為新定義類的基類或父類。派生類可以增加新的屬性和方法。
3、保護資料成員可以被本類及其派生類的成員函式直接訪問,但不能被外部物件直接訪問。protected成員的開放特性介於private成員和public成員之間。
4、派生類的定義方法:派生類繼承了基類的所有屬性和方法,根據需要,派生類還會增加自己所特有的屬性和方法。派生類定義的語法形式為:class 派生類名:派生方式 基類名;
5、派生方式的三種型別:public、protected和private,對於不同的派生方式,其訪問控制約束不同。
基類中的訪問屬性
派生方式
public
protected
private
public
public
protected
private
protected
protected
protected
private
private
private
private
private
6、派生類的資料成員包括從基類繼承而來的資料成員和派生類新增的資料成員。建構函式、複製建構函式、析構函式和賦值操作符不能被繼承。為了對派生類新增的資料成員和基類資料成員進行初始化,需要為派生類定義建構函式。在派生類物件生命週期結束時,派生類的析構函式被自動呼叫。可通過該析構函式完成派生類中所分配記憶體的清理工作和資料儲存工作。
7、派生類物件通過建構函式進行初始化時,為完成繼承自基類的資料成員的初始化,要呼叫其基類建構函式。派生類建構函式的定義形式為:派生類名(形參宣告):基類名(參數列),其中,傳給基類建構函式的引數,可以來自於派生類建構函式的形參,也可以使用常數值。
當建立乙個派生類物件時,首先執行基類的建構函式,然後再執行派生類的建構函式。當基類中沒有顯式定義建構函式,或者基類中建構函式沒有引數,或者基類建構函式的所有引數均使用預設引數時,不需要通過派生類建構函式向基類建構函式傳遞引數。
8、在派生類中,可以根據需要,顯式地定義析構函式。在執行派生類的析構函式時系統會自動呼叫基類的析構函式,從而完成基類物件的清理工作。派生類和基類析構函式的執行順序與建構函式的執行順序相反,即先執行派生類的析構函式,再執行基類的析構函式。如果在派生類中沒有顯式地定義析構函式,那麼系統會建立乙個預設析構函式。
9、當派生類中含有物件成員的話,通常也需要通過派生類的建構函式對其進行初始化。
⑴先執行基類的建構函式,再執行物件成員的建構函式,最後執行派生類建構函式的函式體。在物件撤銷時,析構函式的執行順序與建構函式的執行順序正好相反。
⑵當派生類中有若干個物件成員時,通常,其建構函式的定義形式為:派生類名(形參宣告):基類名(參數列0),物件成員1(參數列1)……
⑶如果派生類的基類是另乙個類的派生類,那麼,每個派生類通常只負責其直接基類的資料成員的初始化。
10、在c++中,派生類成員的名字可以與基類成員的名字相同,這些名字相同的成員稱為同名成員。在這種情況下,在派生類使用該名字意味著訪問在派生類中重新說明的成員。如果要在派生類中使用基類中的同名成員,則必須在該同名成員前加上基類名和作用域運算子::。如果想通過派生類的物件訪問基類中的同名成員,也要在同名成員名前加上基類名和作用域運算子::。
11、在c++中,以public方式繼承的派生類可以看成是其基類的子型別。賦值相容規則是指在需要基類物件的任何地方都可以使用子型別隊形來替代。通過公有繼承,派生類繼承了基類中除建構函式]析構函式以外的所有非私有成員,而且這些成員的訪問控制屬性也與基類成員完全相同。這樣,公有派生類具有了基類的所有特性,凡是基類能夠解決的問題,派生類也能解決。
12、如果派生類只有乙個直接基類,稱為單繼承。具有兩個或兩個以上直接基類的繼承關係稱為多繼承。
⑴多繼承派生類的定義形式為:class 派生類名:派生方式1 基類名1,派生方式2 基類名2……;
⑵多繼承派生類建構函式的定義形式為:派生類名(形參宣告):基類名1(參數列1),基類名2(參數列2)……;
⑶在定義和使用多繼承派生類時,有時會產生二義性問題。明確指出呼叫哪乙個副本的成員,可以避免二義性。
13、虛基類在派生類中說明:class 派生類名:virtual 派生方式 基類名;virtual關鍵字也可以寫在派生方式關鍵字的後面。虛基類的成員在其派生類中只會出現乙個副本,避免了二義性。
⑴如果虛基類中定義了帶形參的建構函式,而且沒有定義預設建構函式,那麼該虛基類所有直接或間接的派生類都必須在其建構函式定義中給出對虛基類建構函式的呼叫。
⑵虛基類資料成員的初始化是由其最遠派生類的建構函式對虛基類建構函式的呼叫來完成的。該派生類的其他基類對虛基類建構函式的呼叫會被自動忽略。
⑶基類在作為某些類的虛基類時,還可以同時作為另一些類的一般基類。
總結 C 真是博大精深(一)
c 的輸入 輸出和非物件導向的一些特性 最終解釋權歸原文作者所有,侵權必究 1 c 語言是c語言的超集,c語言中的表示式 語句 函式等在c 中仍然可以使用,c 語言是物件導向的語言,但是也包含一些非物件導向的特性。2 include是編譯預處理命令,用於指示編譯器在進行程式預處理時,將檔案iostr...
總結 C 真是博大精深(一)
c 的輸入 輸出和非物件導向的一些特性 最終解釋權歸原文作者所有,侵權必究 1 c 語言是c語言的超集,c語言中的表示式 語句 函式等在c 中仍然可以使用,c 語言是物件導向的語言,但是也包含一些非物件導向的特性。2 include是編譯預處理命令,用於指示編譯器在進行程式預處理時,將檔案iostr...
漢語真是博大精深啊
漢語真是博大精深啊,轉自網易評論 某天一學校老師舉行婚禮。各科研組為祝賀新人增添喜慶氣氛,就各自寫了一副對聯送去。第乙個是政治組寫的,下聯 幾進幾齣不是野蠻侵入,造就一代新人。橫批 生命在於運動。語文組寫的是,上聯 新人新床新被褥共享新歡,下聯 好疼好癢好舒服同幹好事。數學組也寫了,上聯是 開括號解...