# 🌳 繼承(Inheritance)
---
- **學習目標:**
- 認識繼承的核心觀念與用途
- 學會實作繼承的語法與運用方法
- 透過繼承設計更靈活的程式架構
---
## 🔖 繼承的基本觀念
- 繼承允許新類別基於現有的類別建立,擁有其特性。
- 提高程式碼的重用性,減少重複實作。
</br>
</br>
| 名稱 | 說明 |
|:------------------------- | -------------------- |
| 基底類別(Base Class) | 被繼承的原有類別 |
| 衍生類別(Derived Class) | 繼承基底類別的新類別 |
---
## 📌 繼承的基本語法
```cpp
class DerivedClass : public BaseClass {
// 衍生類別內容
};
```
衍生類別自動擁有基底類別的成員函式與變數(public/protected)
----
## 🚩 繼承範例:動物與狗
```cpp
class Animal {
public:
void eat() { cout << "吃東西\n"; }
};
class Dog : public Animal {
public:
void bark() { cout << "汪汪!\n"; }
};
```
----
### 使用方式
```cpp
Dog dog;
dog.eat(); // 從Animal繼承來
dog.bark(); // Dog自己的函式
```
----
## 進階範例
1. 機具升級版、優化版
2. AI 模型擴充
---
## 📗 存取權限與繼承
(public、protected、private)
- 存取權限影響繼承後成員在衍生類別的可見度
</br>
</br>
| 存取層級 | 自己類別內 | 衍生類別內 | 外部程式 |
| --------- | ---------- | ---------- | -------- |
| private | ✔️ | ❌ | ❌ |
| protected | ✔️ | ✔️ | ❌ |
| public | ✔️ | ✔️ | ✔️ |
---
### 🚩 protected 的用法
```cpp
class Animal {
protected:
string name;
public:
Animal(string n) : name(n) {}
};
class Dog : public Animal {
public:
Dog(string n) : Animal(n) {}
void showName() {
cout << "名字: " << name << endl;
}
};
```
---
## 📌 繼承中的建構子與解構子
- 建構順序:先父後子
- 解構順序:先子後父
```cpp
class A {
public:
A() { cout << "A建構\n"; }
~A() { cout << "A解構\n"; }
};
class B : public A {
public:
B() { cout << "B建構\n"; }
~B() { cout << "B解構\n"; }
};
int main() {
B obj;
}
// 輸出:
// A建構
// B建構
// B解構
// A解構
```
---
## 📗 函式 hiding/shallowing
- 衍生類別可重新定義(覆寫)基底類別的函式
```cpp
class Animal {
public:
void speak() { cout << "動物叫聲\n"; }
};
class Dog : public Animal {
public:
void speak() { cout << "汪汪!\n"; } // 覆寫函式
};
```
----
### 使用方式
```cpp
Dog dog;
dog.speak(); // 汪汪!
```
---
## 🚩 多層繼承(繼承樹)
```cpp
class Animal {
public:
void eat() { cout << "吃東西\n"; }
};
class Mammal : public Animal {
public:
void breathe() { cout << "肺呼吸\n"; }
};
class Dog : public Mammal {
public:
void bark() { cout << "汪汪!\n"; }
};
```
```cpp
Dog dog;
dog.eat(); // Animal
dog.breathe(); // Mammal
dog.bark(); // Dog
```
---
## ⚠️ 繼承時注意事項
- 使用繼承應符合「`is-a`」語意
- 避免濫用繼承,導致過度複雜
- 建議繼承層數勿過多,確保可維護性
----
## 進階 - 記憶體操作
- [C++ 繼承與指標位址運算實例](/AXABJd8STTaFeG4aoVFpMg)
---
## 🛠️ 課堂練習 (Lab)
- 練習一:
- 建立一個類別 Vehicle (車輛),設計 Car、Bike 繼承它,並各自新增專屬函式。
- 練習二:
- 建立基底類別 Shape,提供計算面積函式,再衍生 Rectangle 和 Circle 類別並覆寫函式。
---
## 💡 本週作業
- 實作員工管理系統,包含基底類別 Employee,衍生類別 Manager、Engineer,並設計基本的資料輸入輸出。
- 實作一個動物園系統,有 Animal 基底類別,Bird 和 Fish 衍生類別,各自有特有的行為函式。
{"title":"🌳 繼承(Inheritance)","description":"學習目標:","contributors":"[{\"id\":\"01487228-6720-47a9-875f-2f01b5d455ad\",\"add\":5296,\"del\":2562,\"latestUpdatedAt\":1754623416273}]"}