1. 類的繼承與派生
1.1 派生類的定義
(1) 定義規範
class 派生類名: 繼承方式 基類1名, 繼承方式 基類2名...
;(2) 從以上形式上看可以多繼承
(3) 繼承方式規定了如何訪問從基類繼承的成員
(4) 繼承的主要目的是實現**的重用與擴充
(5) 派生類生成過程
① 吸收基類成員
a. 繼承後,派生類包含了基類中除構造和析構函式之外的所有成員。構造和析構函式需要重新定義
② 改造基類成員
a. 通過繼承方式來控制對基類成員的訪問控制
b. 對基類的資料或函式成員進行覆蓋和隱藏。隱藏的意思是在派生類中定義乙個與基類函式同名(同引數)的函式。(不同引數叫過載)
③ 新增新的成員
2. 訪問控制
2.1 公有繼承 public
(1) 基類的公有成員和保護成員的訪問屬性在派生類中不變,基類的私有成員不可直接訪問
2.2 私有繼承 private
(1) 預設繼承方式為私有繼承
(2) 基類中的公有成員和保護成員都以私有成員身份出現在派生類中,而基類的私有成員在派生類中不可直接訪問
也就是說基類成員都以私有方式存在派生類中,派生類中其他成員可以訪問這些。但是在類外無法通過派生類物件訪問這些。
經過私有繼承後,所有基類成員都成為派生類的私有成員,如果進一步派生的話,基類的全部成員都無法在新的派生類中被直接訪問。因此私有繼承用的比較少。
2.3 保護繼承 protected
(1) 基類的公有和保護成員都以保護成員身份出現在派生類中,基類的私有成員不可繼承。
(2) 注意私有繼承和保護繼承的區別
2.4 靜態成員不受繼承方式影響,在整個類層次體系中都可以訪問
3. 型別相容規則
3.1 定義:
在需要基類物件的時候,都可以用公有派生類的物件來替代
3.2 型別相容規則所指的替代包括以下情況。替代後,派生類物件就可以作為基類物件使用,但只能使用從基類繼承的成員。
(1) 派生類的物件可以隱含轉換為基類物件
(2) 派生類的物件可以初始化基類的引用
(3) 派生類的物件可以隱含轉換為基類的指標
例子:
classbclass d: public
bb b1, *pb1;
d d1;
b1 = d1; //
實現(1)
b &rb = d1;//
實現(2)
pb1 = &d1;//
實現(3)
4. 派生類的構造與析構函式
4.1 建構函式
(1) 構造派生類物件時,需要對基類的成員物件和新增成員物件進行初始化。基類的建構函式並沒有繼承下來,因此需要給派生類新增新的建構函式。派生類對於基類的很多成員物件不能訪問,因此需要呼叫基類的建構函式來對基類中不能訪問的成員進行初始化。在構造派生類物件時,首先呼叫基類的建構函式,然後構造初始化參數列,然後執行函式體。
(2) 語法:
派生類名::派生類名(參數列):
基類名1(基類1初始化參數列)...,基類名n(基類n初始化參數列),
成員物件名1(成員物件名1初始化參數列),...,成員物件m(成員物件m參數列)
(3) 派生類建構函式執行一般次序如下
① 呼叫基類建構函式,按照繼承時宣告順序
② 對派生類新增的成員物件初始化,按照類中宣告順序
③ 執行建構函式體
4.2 複製建構函式
4.3 析構函式
(1) 執行順序與建構函式相反。
① 先執行析構函式體
② 再呼叫派生類中類物件的析構函式體
③ 呼叫基類的析構函式
5. 派生類成員的標識與訪問
5.1 作用域分辨符 ::
(1) 如果派生類宣告了與基類成員函式同名的新函式,即使函式引數不同,從基類中繼承的同名函式的所有過載形式都會被隱藏。只有在相同作用域中定義的函式才可以過載。。。(這個地方???)
(2) 如果某個派生類繼承了多個基類,在這些基類中有同名的資料。此時訪問方式為:
classbase1
class
base2
class derived: public base1, public
base2
derived d;
d.base1::
var = 2;//
以這種方式!切記!
d.base2::var = 4;
(3) 還是乙個派生類derived的兩個父類base1、base2是由同乙個基類base0派生的,那麼,base1和base2中都有base0的乙個副本,而只想要乙個副本。那就需要用到虛基類。
5.2 虛基類
(1) 如果將上面講的base0設為虛基類,則不同路徑繼承到derived的同名資料在記憶體中只有乙個副本,同乙個函式名只有乙個對映。這樣就解決了同名成員唯一標識問題。
(2) 語法:
class 派生類名:virtual 繼承方式 基類名
(3) 例子:
classbase0
class base1:virtual
public
base0
class base2:virtual
public
base0
class derived: public base1, public
base2
derived d;
d.var0 = 0;//
只有乙個var0的副本
5.3 虛基類及派生類的建構函式
(1) 如果上面的例子中虛基類沒有預設建構函式就比較麻煩了,要改成下面的形式
classbase0
intvar0;
};class base1: virtual
public
base0
}class base2:virtual
public
base0
}class derived:public base1, public
base2
;}
(2) 雖然已經改造了,但是不用擔心base0的var0會初始化三次,因為在建立derived的物件時,首先呼叫原始基類的建構函式,之後的base1和base2中對base0的建構函式都被自動忽略了。
(3) 構造乙個類物件的一般順序為:
① 如果該類有直接或間接的虛基類,執行虛基類的建構函式
② 如果還有其他基類,按照繼承宣告中的順序,執行建構函式,但不執行虛基類的建構函式
③ 按照類定義中的順序,對派生類的成員物件進行初始化。對於類物件成員,如果出現在建構函式初始化列表中,則以指定的引數執行建構函式,如未出 現,則執行預設建構函式;對於基本資料型別,如果出現在建構函式初始化列表中,則用指定的值初始化,否則什麼也不做
④ 執行建構函式的函式體
繼承與派生(1 基礎知識) 重點
1.繼承是類之間的一種關係,建立乙個新類時,通過吸收已有類的資料和行為來建立新類,並可以新增新的資料和行為來增加類的功能。2.繼承時,除了建構函式和析構函式,之外的資料都會原封不動的繼承下來,但能不能用是另外乙個問題 3.建立新類時,並不需要建立全新的資料和成員函式,我們可以指明這個新類應對繼承現有...
C C 基礎知識總結 函式
1.隨機函式的使用 1.1 標頭檔案 include 或 include 1.2 用法 srand int seed 偽隨機,傳隨機種子 int d 1 rand 6 生成1 6隨機數 2.函式的引數傳遞 2.1 函式未被呼叫時,函式的形參不占有記憶體空間,也沒有實際的值。只有在函式被呼叫時才為形參...
C C 基礎知識
c 基礎知識 定義在class宣告內的成員函式預設是inline函式 進製 問 假設在n進製下,等式 240 12 2880 成立,n值是 a 19 b 18 c 17 d 16 e 15 f 以上都對 答 2 n 2 4 n 1 1 n 2 2 n 3 8 n 2 8 n 1 化簡後為恒等式,故n...