繼承將具有共同特徵、相互關聯的類別組織成層次結構:共同部分提煉為基類(父類),其他類別直接或間接繼承成為派生類(子類)。這實現了程式碼復用——子類自動擁有父類的所有非私有成員。

public 繼承:基類 public 成員保持 public,protected 保持 protected。protected 繼承:基類 public/protected 成員均變為派生類 protected。private 繼承:基類所有非私有成員均變為派生類 private。protected 成員用於「想與派生類分享,但不想被外部存取」的場景。
子類與父類成員(含變數與函數)同名時,子類成員會隱藏父類同名成員,與參數列表、返回型別無關。需透過作用域解析運算子(Base::member)存取被隱藏成員。

鑽石繼承 導致兩大問題:
在繼承關係前加 virtual 關鍵字:
class A { protected: int _a; };
class B : virtual public A { ... };
class C : virtual public A { ... };
class D : public B, public C { ... }; // D 中只有一份 _a

虛繼承透過虛基類指標/虛基類表實現共享,解決冗餘與二義性,但會增加存取開銷,降低效能。
virtual。class Book { public: virtual void ShowPrice() { cout << "全價"; } };
class BarginBook : public Book { public: void ShowPrice() override { cout << "半價"; } };
Book* p = new BarginBook();
p->ShowPrice(); // 輸出「半價」—— 動態綁定
透過基類指標刪除派生類物件時,若基類解構函數非虛函數,僅呼叫基類解構函數,導致派生類資源洩漏。基類解構函數應宣告為 virtual,確保完整的解構鏈呼叫。