將資料 (成員變數) 與操作資料的函數 (成員函數) 綁定在類別內部,並透過存取權限 (public/protected/private) 隱藏實作細節。
private 成員僅供類別內部存取,對外暴露極少 public 介面。衍生類別 (子類別) 繼承基底類別 (父類別) 的資料成員與成員函數,並可新增、覆寫、隱藏 父類別成員。
Dog : Animal、Car : Vehicle。| 類型 | 語法 | 特點 |
|---|---|---|
| 公有繼承 | class D : public B | 保留基底介面語意,is-a 關係 |
| 保護繼承 | class D : protected B | 基底 public/protected 變 protected |
| 私有繼承 | class D : private B | 基底所有成員變 private,實作細節復用 |
| 多重繼承 | class D : public B1, public B2 | 繼承多個基底,需解決菱形問題 |
| 虛擬繼承 | class D : virtual public B | 解決菱形繼承資料重複與二義性 |
同一訊息 (函數呼叫) 作用於不同物件產生不同行為。分靜態多態 (編譯期) 與動態多態 (執行期)。
virtual、override (C++11)、final (C++11)。class Animal {
public:
virtual void speak() const { cout << "Animal sound\n"; }
virtual ~Animal() {} // 虛擬解構函數,必須!
};
class Dog : public Animal {
public:
void speak() const override { cout << "Woof!\n"; }
};
class Cat : public Animal {
public:
void speak() const override { cout << "Meow~\n"; }
};
void makeSound(const Animal& a) { a.speak(); } // 參考多態
int main() {
Dog d; Cat c;
makeSound(d); // Woof!
makeSound(c); // Meow~
Animal* p = new Dog();
p->speak(); // Woof!
delete p;
}
基底類別若有虛擬函數,解構函數必須宣告為 virtual。否則 delete 基底指標 僅呼叫基底解構函數,衍生部分資源洩漏。
private,最小化介面。override,編譯器檢查簽名一致。final 防止進一步繼承/覆寫。