關於 C++ 中的強制轉換 - 基礎篇
阿新 • • 發佈:2021-03-04
## 引言
假設有基類 `A`,包含了虛擬函式 `func1`,以及有派生類 `B`,繼承於類 `A`,派生類 `B` 中實現了函式 `func1`。此時可以用 `A` 型別的指標指向 `B` 型別的物件,並用 `A` 型別的指標呼叫 `B` 型別物件中的函式 `func1`。這時,就形成了**多型**。包含虛擬函式的類 `A`,我們也稱為**多型類**。
由於派生類 `B` 完整包含了 基類 `A` 的所有定義,將 `B` 型別的指標轉換為 `A` 型別的指標**總是安全的**。
而將 `A` 型別的指標強制轉換為 `B` 型別的指標時,如果 `A` 型別指標指向的物件確實為 `B` 型別的物件,那麼轉換**也是安全的**。此時,該 `B` 型別物件被稱為完整物件(complete object)。
## 強制轉換有哪些型別?
C++ 包含了以下幾種強制轉換運算子,這些運算子用於消除老式 C 語言轉換中的存在的歧義和隱患:
> - `dynamic_cast`
> - `static_cast`
> - `const_cast`
> - `reinterpret_cast`
> - `safe_cast`
本文會著重介紹如何使用 `dynamic_cast` 和 `static_cast`。
提醒:
> 除非必須,不要使用 `const_cast` 和 `reinterpret_cast`,因為它們存在一些老式 C 語言轉換中的隱患。
### `dynamic_cast` 運算子
語法:
```
dynam