1、多型性是物件導向的核心,而繼承則是實現多型性的基礎。
2、由類a產生乙個類b,類b是類a的特殊版本。類a稱為基類,類b稱為派生類,類a是父,類b是子。
類b自動包含基類a的所有資料成員和所有函式成員(只是有一些限制條件)。即派生類繼承了基類的成員。
由類a派生出類b,類b再派生出類c,則a是b的直接基類,a是c的間接基類。
3、繼承與聚合
派生類物件應代表「有意義的基類物件」。
種類測試:任何派生類物件都是基類型別的物件,即:派生類應描述基類所表示的物件的乙個子集。
如:基類汽車中分出轎車、卡車類,那麼卡車是汽車中的乙個子集。
沒有通過種類測試,則不能使用類的派生機制。比如:汽車類中包括引擎類、傳送類等,但引擎不是汽車,這種不能用於派生。
具有包含的性質的依賴性就稱為集合,如果沒通過種類測試,但是具有包含性質,則稱為「聚合」
4、繼承類的宣告和定義:
繼承類的宣告:應包括基類的標頭檔案。
繼承類的定義(實現):繼承類的標頭檔案(不包括基類的標頭檔案)
5、基類的私有資料成員也中派生類的成員,它們在派生類中仍然是私有,但不能在派生類類內直接訪問,須由基類派生來的其它成員間接訪問。
6、protected和private具有相同效果。類外物件不能直接訪問。
不同處:私有成員繼承後,無論哪種繼承,都是繼承類的私有成員,但不能在繼承類直接訪問。類外物件更不可能訪問
protected繼承後,是保護或私有,可由繼承類類內直接訪問,類外(基類或繼承類外)不能直接訪問。
因此:基類私有成員對基類總是私有,在派生類中:
一、繼承類類內不能直接訪問基本的私有成員;二、基類的私有成員仍然是派生類中的私有成員。
一句話:基類的私有成員是派生類的私有成員,但在派生類中不能直接訪問。
7、公有繼承:基類成員的訪問狀態在繼承類中不變,原來是公有派生類仍為公有,原來是protected在派生類中也是protected。
私有繼承:基類中的公有和保護在繼承類中都變成"私有「,在派生類類內可直接訪問。但基類私有成員在派生類類內不能直接訪問。
8、資料成員根據需要調節protected和private
如果私有成員在繼承類中不再需要直接訪問,可宣告為private
如果基類私有成員在繼承類中需要繼承類中的函式成員直接訪問進行引用,可宣告為protected.
如果需要在派生類中留有介面,可指定為public
9、特使:using
儘管有上面明確的訪問說明,但有時我們只須要某乙個函式的訪問性更高可更低。可以在派生類中用using單獨說明:
class b:private a;
類b私有繼承基本a,本來其所有成員在類b中都是私有,但為了使類a中的某成員volume()變成公有,可以使用using及類名作用域來提高訪問性。
這樣volume()就變成了公有成員,在繼承類的物件中直接使用。
注意:1、在繼承類中對基類成員使用using宣告,必須加上基類名限定;
2、在繼承類中不能提供函式的返回值和引數,只須函式名和空括號即可。
3、不能應用於基類的私有成員,因為它們固定為「繼承但不能直接訪問」。
4、訪問狀態可以擴大可縮小,比如在繼承類的私有成員中用using可以把基類的公有繼承的公有成員限制成私有狀態。
10、在構造乙個繼承類物件時,必定首先構造對應的基類物件。
注意:構造的本質:是產生資料成員,即宣告並初始化資料成員,從無到有,且有值。(不是對已有資料進行更改賦值)
因此:基類中非私有的資料成員(protected或public)可以在派生類中訪問,但是,它們不能在派生類建構函式的初始化列表中初始化。
一、構造派生類物件時,首先必須先構造基類,因為先有基類的成員產生,再產生派生類的「特別「的成員,來組成乙個整體成為派生類的成員。
二、初始化列表很高效,它在呼叫基類建構函式產生物件或資料之前就要進行處理。
如果在派生類的初始列表中來初始,這個時候基本的資料並沒產生,如果這個時候產生了,那個基類又產生這樣不就矛盾了。
解決:因此不能在初始化列表中進行,而是在派生類的建構函式體中進行賦值,因此這個時候,物件的主要部分已經建立,已經通過自動呼叫基類的預設
建構函式建立,因此函式體中就可以進行直接引用了(因此已經存在了)。
11、同名的情況:重點!!!
在沒學類之前,同乙個作用域同時定義兩個變數的資料是不允許的。
同乙個作用域同時定義兩個不同的函式名是可以的(只要引數不同,即過載)。
同乙個作用域乙個是同名的變數與另乙個同名函式是不允許共存。
同樣在類也是滿足上面條件的。
注意:繼承類類內是乙個作用域,基類類內是乙個作用域,兩個作用域是不同的。
查詢名字的時候,從本類開始,再到基類。
如果沒有同名的更好,直接就使用其中乙個,不論它是繼承類類內,還是基類類內。
但有同名時,如果僅在繼承類內,就判斷是否是過載(注意基類繼承過來的不能這樣去規劃),因為派生類會隱藏基類的成員。
如果強制要提到本作用域,必須使用using宣告,即在繼承類中使用using 基類::函式名 這樣繼承類就會把基類這個函式納入本作用域內。
class base;
class derived:public base;
如上面,show不會過載,因為過載是在同乙個作用域才發生,基類和繼承類是不同的作用域,繼承類會隱藏基類的成員。
使用using可將本是基類的作用域,提到派生類中(因此它在兩個類的都有作用域),這樣,就可從派生類中直接使用並發生過載。
12、多重繼承:有多個基類的派生類,稱為多重繼承,當然只有乙個基類的稱單一繼承。
多重繼承,它把這些基類的特性加在一起,形成乙個包含所有基類功能的合成物件,也稱「混合程式設計」。
定義時,每個基類都在冒號後指定,用逗號隔開。
注意:與單一繼承一樣,如果省略訪問指定符,就使用預設的private。
13、重複的繼承:多繼承有可能它們的間接基類都是來自乙個,因為從每一條繼承下來都包括基類這個子物件,就造成了重複。
但是,一般情況,我們應該避免基類的重複。
14、虛基類:為了避免基類的重複,告訴編譯器,在所有派生類中,基類應只出現一次,沒有重複現象,這樣就產生了虛基類。
使用關鍵字virtual,把類宣告為虛基類。把virtual寫下訪問限定符的後面。如class b:public virsual a;
這樣,多重繼承後的派生類中就只有基類的乙個例項,不會重複。
(1) 乙個類可以在乙個類族中既被用作虛基類,也被用作非虛基類。
(2) 在派生類的物件中,同名的虛基類只產生乙個虛基類子物件,而某個非虛基類產生各自的子物件。
(3) 虛基類子物件是由最遠派生類的建構函式通過呼叫虛基類的建構函式進行初始化的。
(4) 最遠派生類是指在繼承結構中建立物件時所指定的類。
(5) 派生類的建構函式的成員初始化列表中必須列出對虛基類建構函式的呼叫;如果未列出,則表示使用該虛基類的預設建構函式。
為什麼都要列出呢?因為你都不列出,又面臨二義性的問題,最遠派生類中是由二個或以上直接或間接基類形成,向上去構造呼叫時
就會不清楚選擇哪乙個基類去構造虛擬基類,為了解決這個二義性,虛基類的派生類都必須對虛基類的構造進行呼叫,否則就是直接呼叫
虛基類的缺少(這一樣是要呼叫,只是呼叫的預設虛基類的建構函式)。
(6) 從虛基類直接或間接派生的派生類中的建構函式的成員初始化列表中都要列出對虛基類建構函式的呼叫。
但僅僅用建立物件的最遠派生類的構造函式呼叫虛基類的建構函式,而該派生類的所有基類中列出的對
虛基類的建構函式的呼叫在執行中被忽略,從而保證對虛基類子物件只初始化一次。
(7) 在乙個成員初始化列表中同時出現對虛基類和非虛基類建構函式的呼叫時,虛基類的建構函式先於非虛基類的建構函式執行。
15、類型別轉換
派生型別轉換為基類總是合法和自動的。因為每個派生類物件都至少包含乙個基類物件,即派生類總是基類的乙個子集。
如:box abox;
abox=acarton;//acarton為派生類物件,因為派生類物件包含基類部分,carton部分被切開並捨棄。
但是上面是不能反過來的:acarton=abox;因為基類中不包含派生類的資訊,這樣轉換得到不合理解釋,所是錯誤的。
注意:在多重繼承中,如果沒有使用虛基數,派生類轉換為基數是錯誤的,因為此時有多個基類子物件,編譯器並不知道
選擇如乙個,這樣就具有模糊性,編譯器是不允許這種情況發生的。
注意上面兩名**與這個是不同的:box abox=acarton;
首先acarton隱式轉換成box物件,然後呼叫拷貝建構函式建立abox物件。
16、多繼承的順序:class a:public b1,public b3,public b2
private:
b3 menberb3;
b2 menberb2;
b1 menberb1;
a多繼承於b1,b2,b3,其建構函式中的初始化順序與其排序無關,即,構造時,先基類後巢狀成員,初始化基類以類前後宣告為準,即
上面宣告的是b1,b3,b2,以這個順序進行初始化,注意不是構造中的b1,b2,b3。然後再初始化巢狀類成員,是以成員的宣告為準,即下
面私有中的b3,b2,b1,而不是構造中的b1,b2,b3的順序。
繼承有好幾種:
單繼承:只有乙個基類的派生 。
多繼承:多個基類同時派生乙個派生類的。
多重派生:乙個基類同時派生多個派生類的。
多層派生:派生類向下層繼續派生的。
繼承關係 同居關係能否繼承對方遺產?
隨著社會的發展,人們思想觀念的逐漸開放,傳統的婚姻家庭倫理觀念和兩性關係觀念有了質的改變。從2013年開始,中國的結婚率連續5年下降,2018年中國結婚率只有7.2 創下近十年來新低。與此同時,離婚率卻在不斷上公升。據最新資料顯示,2018年全國結婚人數1010.83萬對,同比下降48萬對。離婚人數...
(十五)關於繼承
es5中繼承的實現 es5中的思路是將子類的原型設定成為父類的原型 function super function sub let s new sub sub.prototype object.create super.prototype,另外案例 shape 父類 superclass funct...
我與父輩的酒局
乙個事業頗有成就,在村里不愁吃喝的幹叔叔訓斥我道 爾為何人乎?爾欲叛親乎?這句反問,讓我丈二。今天文章寫畢,父親覺得酷熱難耐,便商議去酒店與幹兄弟齊聚。我作為他的小兒子,自然在陪同之列。義結桃園 跟 水泊梁山 在如今的農村依舊有市場。父親幹兄弟八個,婚後較少來往,但,對於農村人來講,幹兄弟定然如親兄...