Java 有 final 關鍵字禁止類別被繼承,C++ 無內建機制。需求場景:控制繼承層級、防止菱形繼承、API 設計約束。核心思路:阻止子類別建構基底類別部分,使其無法實例化。
class Base {
private:
Base() {}
public:
static Base* Create() { return new Base(); }
};
缺點:語法笨拙,使用者必須記得呼叫 Create(),且無法自然支援繼承鏈。
class FinalMixin {
friend class Derived; // 僅 Derived 可存取
private:
FinalMixin() {}
~FinalMixin() {}
};
class Derived : public FinalMixin { /* ... */ };
class Further : public Derived { /* 編譯通過!原因:Further 透過 Derived 建構 FinalMixin */ };
失敗原因:Further 雖非 Friend,但透過 Derived 的建構函式間接完成 FinalMixin 建構,繞過存取檢查。
關鍵洞察:虛基類別的建構函式由最末端衍生類別直接呼叫。若 FinalMixin 建構函式為私有,且僅授權 Derived 為 Friend,則 Further 必須直接呼叫 FinalMixin() 而失敗。
template
class FinalMixin {
friend T; // 僅授權具體衍生類別
private:
FinalMixin() {}
~FinalMixin() {}
};
// 使用方式
class MyBase { /* ... */ };
class MyFinalClass : virtual public FinalMixin, public MyBase {
public:
MyFinalClass() {}
~MyFinalClass() {}
};
// 測試
class TryDerive : public MyFinalClass {}; // 編譯錯誤:無法存取 FinalMixin 建構函式
int main() {
MyFinalClass ok; // 正常
// TryDerive fail; // 編譯錯誤
return 0;
}
virtual 繼承強制最末端類別建構虛基類。friend T 模板化,免去每次修改 Friend 宣告。FinalMixin 為純類別 (無資料成員),無菱形繼承資料冗餘與二義性風險。此技術屬於 Mixin (混入) 模式一種,同理可實作 NonCopyable、Singleton 等編譯期約束。多重繼承非洪水猛獸,關鍵在於使用者的設計功力。