繼承建立「is-a」關係。基類(父類)定義通用屬性,派生類(子類)擴展特化功能。本文系統梳理公有繼承、構造函數調用順序、protected 成員訪問、虛繼承解決菱形問題等核心概念。
class TableTennisPlayer {
string firstname, lastname; bool hasTable;
public:
TableTennisPlayer(const string& fn="none", const string& ln="none", bool ht=false);
void Name() const; bool HasTable() const { return hasTable; }
void ResetTable(bool v) { hasTable = v; }
};
class RatedPlayer : public TableTennisPlayer {
unsigned int rating;
public:
RatedPlayer(unsigned int r=0, const string& fn="none", const string& ln="none", bool ht=false);
RatedPlayer(unsigned int r, const TableTennisPlayer& tp);
unsigned int Rating() const { return rating; }
void ResetRating(unsigned int r) { rating = r; }
};
1. 基類構造函數(按繼承聲明順序)
2. 成員對象構造(按聲明順序)
3. 派生類初始化列表
4. 派生類構造函數體
派生類構造函數必須在初始化列表中顯式調用基類構造函數傳遞參數。
public 繼承:基類 public → 派生類 public;基類 protected → 派生類 protected;基類 private → 派生類不可直接訪問。
protected 成員允許派生類直接訪問,但破壞封裝性,易導致無效狀態,建議優先使用 private + public/protected 方法。
菱形繼承導致基類成員重複。虛繼承(virtual public Base)確保只有一份基類子對象。最遠派生類必須顯式初始化虛基類,中間類對虛基類的初始化被忽略。構造順序:虛基類(深度優先左到右)→ 非虛基類 → 成員 → 函數體。
基類指針刪除派生類對象時,若基類析構非虛,僅調用基類析構導致資源洩漏。聲明 virtual ~Base() 確保正確調用派生類析構釋放資源。多態使用時必須虛析構。
掌握繼承機制細節,是設計健壯 C++ 類層次結構的基礎。