繼承:
class
worker
:public person
;// person -> 基類/父類
// worker -> 派生類/子類
;
例項化時會先呼叫person()
再呼叫worker()
;銷毀時會先呼叫~worker()
再呼叫~person()
。
即 先呼叫 父類的建構函式, 再呼叫子類的建構函式;先呼叫子類的析構函式,再呼叫父類的析構函式。
公有繼承 :public
繼承的時候將會把父類的 public 繼承,父類的 protected 繼承。
public 屬性可以在任意地方呼叫,而 protected 屬性只能在成員函式中呼叫
對於父類的 private 屬性,子類無法繼承和訪問
公有繼承總結:
保護繼承 :protected
私有繼承 :private
保護繼承和私有繼承均修改了父類的訪問限定符
私有繼承類似於 has a 的關係
隱藏(重寫)
父子關係 成員同名 隱藏
class
person
;
class
soldier
:public person
;
int
main
(void
)void solider::
work()
覆蓋(過載)class
person
;
class
soldier
:public person
;
父類的宣告,子類的定義
person *p =
new solider;
void
func
(person &p)
// 呼叫時,可以傳入 person 或者 person 的子類
func
(new
solider()
);delete p;
p =null
;// 列印結果:
// marry
// 我是人類
注意:若不加 虛析構函式 ,則釋放記憶體時只會執行person
的析構函式,不會執行子類soldier
的析構函式;父類加上 虛virtual
修飾符後,子類的析構函式在父類呼叫之後也會自動呼叫。
// 會建立臨時物件 p,隨後被銷毀
void
test1
(person p)
// 以下兩個函式並不會產生新的臨時物件,效率更高
void
test2
(person &p)
void
test3
(person *p)
test1
(p);
test1
(s);
test2
(p);
test2
(s);
test2
(&p)
;test2
(&s)
;
多重繼承
即 步兵類 繼承 士兵類,士兵類 繼承 人類。存在隔代 爺孫關係。
多繼承
class
worker
;class
farmer
;class
migrantworker
:public worker,
public farmer //若不寫則為private
;
注意:在例項化migrantworker
的時候,會根據初始化列表的順序 分別呼叫父類的建構函式
析構函式順序正好相反
菱形繼承
如此,同時存在了多繼承和多重繼承,當例項化 d 物件的時候,會同時呼叫兩次a 的建構函式,浪費資源。並且在記憶體中會分別維護兩份 person 資料
使用虛繼承可以解決當前問題。
關鍵字: virtual
class
worker
:virtual
public person // 虛基類
;class
farmer
:virtual
public person
;class
migrantworker
:public worker,
public farmer
;
C 遠征之友元函式篇
相信大家都會有點小疑問?何為友元函式難道是friend?那麼他又是怎樣定義的呢?表現形式是什麼?關鍵字又是什麼呢?友元函式與類的成員函式區別?下面就一一給大家介紹一下揭秘中。友元函式的定義 c 程式設計中如果需要訪問非本類的私有成員,那麼就需要用到友元。否則私有成員是無法被外部直接訪問的,而友元可以...
C 遠征之封裝篇(下)
2 2 物件陣列實踐 檔案 class coordinate 檔案 include include coordinate.h using namespace std coordinate coordinate for int j 0 j 3 j p delete p p null system pa...
c 遠征之封裝篇(拷貝建構函式)
拷貝建構函式 示例安排 1.定義乙個array類,資料成員為m icount,成員函式包括資料封裝 建構函式 拷貝建構函式和析構函式,通過此示例體會淺拷貝原理。2.增加資料成員m parr,並增加m parr位址檢視函式,同時改造建構函式 拷貝建構函式和析構函式,體會拷貝的原理和必要性。1.淺拷貝建...