# [19] 繼承 — 基礎
## FAQs in section [19]:
* [19.1] 對于C++,繼承是否重要?
* [19.2] 何時該使用繼承?
* [19.3] 在C++中如何表達繼承?
* [19.4] 將一個派生類型的指針轉換成它的基類型可以嗎?
* [19.5] `public:`, `private:`和 `protected:`有什么不同?
* [19.6] 為什么派生類不能訪問基類的`private:`成員?
* [19.7] 如何才能在改變類的內在部分時,保護其派生類不被破壞?
## 19.1 對于C++,繼承是否重要?
是。
繼承是面向對象編程和抽象數據類型(ADT)編程的區分標志
## 19.2 何時該使用繼承?
作為一種特化的機制。
人們抽象事物有兩種角度:“部分”和“種類”。Ford?Taurus是一種(is-a-kind-of-a)汽車,并且?Ford?Taurus?有(has-a)引擎,輪胎等。“部分”層次已經隨著ADT風格而成為軟件系統的一部分。繼承則增加了另一種分解的角度。
## 19.3 在C++中如何表達繼承?
通過 `:public`? 語法:
```
?class?Car?:?public?Vehicle?{
?public:
???//?...
?};
```
我們有幾種方式聲明以上的關系:
* `Car` 是?“一種”("a?kind?of?a")`Vehicle(交通工具)`
* `Car` 起源于("derived?from")`Vehicle`
* `Car` 是一種特殊化的("a?specialized") `Vehicle`
* `Car` 是`Vehicle`的一個子類("subclass")
* `Car` 是`Vehicle`的一個派生類(“derived class”)
* `Vehicle` 是`Car`的基類("base?class")
* `Vehicle` 是`Car` 的超類("superclass")(這在C++ 社群中不常用)
(注意:?本?FAQ?的論述僅與公有繼承(`public` inheritance)有關;?私有和保護繼承并不相同)
## 19.4 將一個派生類型的指針轉換成它的基類型可以嗎?
可以。
派生類對象是基類對象的一種。因此從派生類指針到基類指針的轉換是非常安全的,并且始終會發生。例如,如果有一個?car?類型的指針,而實際上指向了?vehicle,這種從?`Car*`?到?`Vehicle*` 的轉換是非常安全的和常規的:
```
?void?f(Vehicle*?v);
?void?g(Car*?c)?{?f(c);?}??// 非常安全;?不用轉換
```
(注意:?本?FAQ?的論述僅與公有繼承(`public` inheritance)有關;?私有和保護繼承并不相同)
## 19.5 `public:`, `private:`和 `protected:`有什么不同?
* 在類的`private:`節中聲明的成員(無論數據成員或是成員函數)僅僅能被類的成員函數和友元訪問。
* 在類的`protected:` 節中聲明的成員(無論數據成員或是成員函數)僅僅能被類的成員函數,友元以及子類的成員函數和友元訪問。
* 在類的`public:`節中聲明的成員(無論數據成員或是成員函數)能被任何人訪問。
## 19.6 為什么派生類不能訪問基類的`private:`成員?
為了使派生類在將來基類改變時不受影響。
派生類無法訪問基類的私有成員。這樣在對基類私有成員作任何改變時,就有效地鎖定了派生類。
## 19.7 如何才能在改變類的內在部分時,保護其派生類不被破壞?
類有兩套截然不同的接口,它們分別面向兩個截然不同的客戶:
* 有為無關類服務的`public:` 接口
* 有為派生類服務的`protected:`?接口
除非你期望你的所有子類全部由你自己的團隊建立,否則你應該考慮讓基類部分成為`private:`,并且用?`protected:`來內聯供子類訪問基類私有數據的訪問函數。使用這種方法,私有部分可以被改變,但是派生類的代碼不會被破壞(除非你改變了`protected`的訪問函數)。
- C++ FAQ Lite
- [1] 復制許可
- [2] 在線站點分發本文檔
- [3] C++-FAQ-Book 與 C++-FAQ-Lite
- [6] 綜述
- [7] 類和對象
- [8] 引用
- [9] 內聯函數
- [10] 構造函數
- [11] 析構函數
- [12] 賦值算符
- [13] 運算符重載
- [14] 友元
- [15] 通過 <iostream> 和 <cstdio>輸入/輸出
- [16] 自由存儲(Freestore)管理
- [17] 異常和錯誤處理
- [18] const正確性
- [19] 繼承 — 基礎
- [20] 繼承 — 虛函數
- [21] 繼承 — 適當的繼承和可置換性
- [22] 繼承 — 抽象基類(ABCs)
- [23] 繼承 — 你所不知道的
- [24] 繼承 — 私有繼承和保護繼承
- [27] 編碼規范
- [28] 學習OO/C++
- [31] 引用與值的語義
- [32] 如何混合C和C++編程
- [33] 成員函數指針
- [35] 模板 ?
- [36] 序列化與反序列化
- [37] 類庫