繼承:
可以理解為一個(gè)類從另一個(gè)類中獲取成員變量和成員函數(shù)的過(guò)程. eg:B類繼承于 A類, 那么B 就擁有 A 的成員變量和成員函數(shù). 被繼承的類稱為父類或者基類, 繼承的類稱為子類或者派生類.
派生類除了擁有基類的成員, 還可以定義自己的成員函數(shù)和成員變量.
class 派生類名: [繼承方式] 基類名 {
派生類的新成員;
};
// 繼承承方式限定了基類成員在派生類中的訪問(wèn)權(quán)限瓤逼,包括 public(公有的)敢艰、private(私有的)和 protected(受保護(hù)的)跟继。此項(xiàng)是可選的,如果不寫钓丰,默認(rèn)為 private 或 protected。
(1) public 繼承方式
- 基類中所有public 成員在派生類中的屬性為 public;
- 基類中所有 protected 成員在派生類中的屬性為 protected;
- 基類中所有 private 成員在派生類中是不可訪問(wèn)的.
(2) protected 繼承方式
- 基類中所有的 public 成員在派生類中為 protected 屬性;
- 基類中所有的 protected 成員在派生類中為protected 屬性;
- 基類中所有的 private 成員在派生類中是不可訪問(wèn)的.
(3) private 繼承方式
- 基類中所有的 public 成員在派生類中都為 private 屬性;
- 基類中所有的 protected 成員在派生類中都為 private 屬性;
- 基類中所有的 private 成員在派生類中都是不可訪問(wèn)的.
基類的構(gòu)造函數(shù)不能被派生類繼承, 在聲明派生類時(shí), 對(duì)繼承過(guò)來(lái)的成員變量的初始化工作也要由派生類的構(gòu)造函數(shù)來(lái)完成. 所以在設(shè)計(jì)派生類的構(gòu)造函數(shù)時(shí), 不僅要考慮派生類新增的成員變量, 還要考慮基類的成員變量, 要讓他們都被初始化.
解決這個(gè)問(wèn)題的思路是:在執(zhí)行派生類的構(gòu)造函數(shù)時(shí), 調(diào)用基類的構(gòu)造函數(shù).
事實(shí)上, 通過(guò)派生類創(chuàng)建對(duì)象時(shí), 必須調(diào)用基類的構(gòu)造函數(shù).
當(dāng)創(chuàng)建對(duì)象時(shí), 會(huì)先調(diào)用基類的構(gòu)造函數(shù), 再調(diào)用派生類的構(gòu)造函數(shù).(自基類向派生類)
析構(gòu)函數(shù)是不能被繼承的.
析構(gòu)函數(shù)的調(diào)用時(shí)與構(gòu)造函數(shù)的調(diào)用順序相反, 先調(diào)用派生類的析構(gòu)函數(shù), 再調(diào)用基類的析構(gòu)函數(shù).
多繼承:
http://c.biancheng.net/cpp/biancheng/view/2986.html
這個(gè)例子很好的說(shuō)明了:基類對(duì)象和派生類對(duì)象之間的賦值僅僅是對(duì)應(yīng)的成員變量的賦值训唱,不會(huì)影響成員函數(shù)刽虹,不會(huì)影響 this 指針。
virtual:
借助虛函數(shù), 基類指針既可以調(diào)用基類的成員函數(shù), 也可以使用派生類的成員函數(shù), 它有多種形態(tài), 或多種表現(xiàn)方式, 這就是多態(tài).
多態(tài)是面向?qū)ο蟮闹饕卣? 在 c++中, 虛函數(shù)的唯一作用就是構(gòu)成多態(tài).
C++提供多態(tài)的目的是: 可以通過(guò)基類指針對(duì)所有派生類(包括直接派生類和簡(jiǎn)介派生類) 的成員變量和成員函數(shù)進(jìn)行"全方位"的訪問(wèn), 尤其是成員函數(shù). 如果沒(méi)有多態(tài), 我們只能訪問(wèn)成員變量.
構(gòu)成多態(tài)的條件:
- 必須存在繼承關(guān)系;
- 繼承關(guān)系中必須有同名的虛函數(shù), 并且它們是覆蓋關(guān)系 (重載不行).
- 存在基類的指針, 通過(guò)改制這調(diào)用虛函數(shù).
Note:
- 派生類中的虛函數(shù)必須覆蓋(不是重載)基類的虛函數(shù), 才能通過(guò)基類指針訪問(wèn).
有虛函數(shù)才能構(gòu)成多態(tài),
另外注意:
- virtual 關(guān)鍵字僅用于函數(shù)聲明, 如果函數(shù)是在類外定義, 則不需要再加上 virtual 關(guān)鍵字.
- 為了方便, 你可以只將基類中的函數(shù)聲明為虛函數(shù), 所有派生類中具有覆蓋關(guān)系的同名函數(shù)都將自動(dòng)成為虛函數(shù).