一步鉴、基礎
- 繼承:獲得基類的全部特性古劲;(基類的基類稱為間接基類)
- 派生:繼承基類后再增加一些特性而形成類斥赋。
二、語法
1. 單繼承:只繼承一個基類产艾;
2. 多繼承:繼承多個基類疤剑。
??默認情況下滑绒,構造函數(shù)和析構函數(shù)不被繼承,而using
語句繼承基類的構造函數(shù)(C++11)
3. 繼承方式
(1)公有繼承
- 基類
public
隘膘、protected
成員在派生類中的訪問屬性不變疑故,而private
不可直接訪問;
- 訪問權限
- 派生類的成員函數(shù):直接訪問基類
public
弯菊、protected
成員纵势,不能訪問基類private
成員 - 派生類對象:其在類外,故只能訪問
public
管钳。
- 派生類的成員函數(shù):直接訪問基類
(2)私有繼承:封堵基類的公有訪問接口
- 基類的
public
钦铁、protected
成員在派生類的訪問屬性均定義為private
成員,而基類的private
成員不可直接訪問蹋嵌;
- 訪問權限
- 派生類的成員函數(shù):直接訪問基類
public
育瓜、protected
成員,不能訪問基類private
成員 - 派生類對象:不能訪問從基類繼承的任何成員栽烂。
- 派生類的成員函數(shù):直接訪問基類
(3)保護繼承
- 基類的
public
躏仇、protected
成員在派生類的訪問屬性均定義為protected
成員,而基類的private
成員不可直接訪問腺办;
- 訪問權限
- 派生類的成員函數(shù):直接訪問基類
public
焰手、protected
成員,不能訪問基類private
成員 - 派生類對象:不能訪問從基類繼承的任何成員怀喉。
- 派生類的成員函數(shù):直接訪問基類
繼承的訪問控制對比表
基類public
|
基類protected
|
基類private
|
||
---|---|---|---|---|
?在派生類中的 訪問屬性 |
公有繼承 | public |
protected |
? |
私有繼承 | private |
private |
? | |
保護繼承 | protected |
protected |
? | |
?訪問權限 | —— | —— | —— | —— |
+ 派生類的成員函數(shù) | 公有繼承 | 直接訪問 |
直接訪問 |
? |
私有繼承 | 直接訪問 |
直接訪問 |
? | |
保護繼承 | 直接訪問 |
直接訪問 |
? | |
+ 派生類的對象 | 公有繼承 | ?? | ?` | ? |
私有繼承 | ? | ? | ? | |
保護繼承 | ? | ? | ? |
??保護繼承后书妻,在類外,通過派生類的對象不能訪問基類繼承的成員躬拢,只能訪問派生類新增的成員躲履;派生類中的成員函數(shù)可以直接訪問。既實現(xiàn)了數(shù)據(jù)隱藏聊闯,又方便繼承工猜,實現(xiàn)代碼重用。
三菱蔬、類型轉換
- 公有派生類對象可被當基類的對象使用篷帅,基類不可當派生類;派生類對象可以隱含轉換為基類對象拴泌、基類的指針魏身,也可初始化基類引用。
- 轉換后蚪腐,通過基類對象名箭昵、指針只能使用從基類繼承的成員,派生類中的新增成員就不能使用了回季。
四宙枷、派生類構造函數(shù)
1. 從基類繼承:using B::B;
(1)只能初始化從基類繼承過來的成員掉房,新增成員就不能通過構造函數(shù)初始化茧跋;
(2)用于派生類新增很少或沒有新增成員的派生類的初始化慰丛;
(3)新增成員只能通過類內初始值或默認初始值初始化;
2. 派生類構造函數(shù)
(1)單繼承
class A{
public:
A();
A(int i):a(i){}
~A();
private:
int a;
};
class B : public A {
public:
B();
B(int i,int j):A(i),b(j){} // 派生類(單繼承)構造函數(shù)
~B();
private:
int b;
};
(2)多繼承
(3)多繼承且有對象成員時瘾杭,派生類構造函數(shù)定義
3. 派生類的復制構造函數(shù)
(1)派生類未定義復制構造函數(shù)時诅病,由系統(tǒng)默認生成;
(2)派生類定義復制構造函數(shù)
- 一般都要為基類復制構造函數(shù)傳遞參數(shù)粥烁;
- 派生類復制構造函數(shù)只能接受一個參數(shù)
- 用來初始化派生類定義的成員
- 也將被傳遞給基類的復制構造函數(shù)贤笆;
4. 派生類的析構函數(shù)(不能從基類繼承)
(1)聲明方法與無繼承關系時,類的析構函數(shù)相同讨阻;
(2)先執(zhí)行派生類析構函數(shù)的函數(shù)體芥永,再調用基類的析構函數(shù)。
五钝吮、虛基類virtual
為了解決“派生類從多個基類派生埋涧,而這些基類又有共同基類,則在訪問此共同基類的成員時奇瘦,將產生冗余,并有可能因冗余帶來不一致性”的問題。??在第一級繼承時就要將共同基類設計為虛基類旅急。