class People { public: void walk() { cout << "People walk"; } };
class Man : public People { public: void walk() { cout << "Man walk"; } };
People* p = new Man();
p->walk(); // 輸出 "People walk" —— 靜態綁定!
C++默認靜態綁定(根據指針類型),與Java不同。
class People {
public:
virtual void walk() { cout << "People walk"; }
};
class Man : public People {
public:
virtual void walk() { cout << "Man walk"; } // 覆寫
};
People* p = new Man();
p->walk(); // 輸出 "Man walk" —— 動態綁定!
class Shape {
public:
virtual void draw() = 0; // 純虛函數,無實現
virtual double area() = 0;
};
class People {
public:
virtual void walk() = 0; // 純虛函數
};
class Man : public People {
public:
void walk() override { cout << "Man walk"; } // 必須實現
};
People* p = new Man(); // 合法
// People p2; // 編譯錯誤:抽象類不能實例化
// Man m; m.walk(); // 合法
| 特性 | 虛函數 | 純虛函數 |
|---|---|---|
| 語法 | `virtual void f();` | `virtual void f() = 0;` |
| 實現 | 可有可無 | 基類無實現 |
| 類類型 | 具體類 | 抽象類 |
| 實例化 | 可 | 不可 |
| 派生類要求 | 可選覆寫 | 必須實現 |
| 用途 | 提供默認行為,允許覆寫 | 定義接口契約,強制實現 |