**類的分解** 是面向對象設計的核心過程:從模糊的基類 (如「交通工具」) 逐步派生出具體子類 (「汽車」、「飛機」)。當基類**不應被實例化** (無具體語義) 時,引入 **純虛函數** 將其變為 **抽象類**,強制派生類實現關鍵接口,形成「契約式設計」。
Vehicle 只有通用屬性 (速度、載客),無具體行為;
class Vehicle {
protected:
float speed; int total;
public:
Vehicle(float s, int t) : speed(s), total(t) {}
virtual void ShowMember() = 0; // 純虛函數:=0 表示無定義
virtual ~Vehicle() {} // 虛析構:必須!
};
#include
using namespace std;
class Vehicle {
protected:
float speed; int total;
public:
Vehicle(float s, int t) : speed(s), total(t) {}
virtual void ShowMember() = 0; // 契約:所有交通工具必須能展示自己
virtual ~Vehicle() {}
};
class Car : public Vehicle {
int aird;
public:
Car(int a, float s, int t) : Vehicle(s, t), aird(a) {}
void ShowMember() override { // 必須實現
cout << speed << "|" << total << "|" << aird << endl;
}
};
class Plane : public Vehicle {
float wingspan;
public:
Plane(float w, float s, int t) : Vehicle(s, t), wingspan(w) {}
void ShowMember() override {
cout << speed << "|" << total << "|" << wingspan << endl;
}
};
int main() {
// Vehicle v(100, 4); // 編譯錯誤:抽象類不可實例化
Car c(250, 150, 4);
Plane p(35.5f, 800, 200);
c.ShowMember(); // 150|4|250
p.ShowMember(); // 800|200|35.5
Vehicle* v1 = &c;
Vehicle* v2 = &p;
v1->ShowMember(); // 多態調用
v2->ShowMember();
return 0;
}
| 特性 | C++ 抽象類 | Java/C# Interface |
|---|---|---|
| 數據成員 | 可包含 (非靜態/靜態) | 僅常量 (隱式 public static final) |
| 構造函數 | 可有 (供派生類調用) | 無 |
| 實現方法 | 可包含普通虛函數/非虛函數 | Java 8+ 可 default/static 方法 |
| 多重實現 | 多重繼承 (需虛繼承解決菱形) | 多實現 (無狀態衝突) |
| 訪問控制 | public/protected/private | 隱式 public |
抽象類是「定義規範、延遲實現」的利器。善用純虛函數表達**必須由子類履行的契約**,配合虛析構保證資源安全,能構建出清晰、可擴展、編譯期受保護的類層次體系。