C++ 無 final 關鍵字(C++11 前),需手動實現「不可繼承」類。C++11 起可直接用 class Final final。
class Sealed {
private:
Sealed() {} // 私有構造
~Sealed() {}
public:
static Sealed* create() { return new Sealed(); }
static void destroy(Sealed* p) { delete p; }
// 禁用拷貝/移動
Sealed(const Sealed&) = delete;
Sealed& operator=(const Sealed&) = delete;
};
// 使用:
// Sealed* obj = Sealed::create(); // 僅能堆上創建
// Sealed::destroy(obj);
缺點:無法在棧上創建對象,需手動管理生命週期,使用不便。
template
class MakeSealed {
friend Derived; // 僅 Derived 可訪問
private:
MakeSealed() {} // 私有構造
~MakeSealed() {}
};
class MyClass : virtual public MakeSealed {
public:
MyClass() {} // OK:MyClass 是友元,可調用 MakeSealed 構造
~MyClass() {}
};
// 嘗試繼承:
// class Hack : public MyClass {}; // 編譯錯誤:Hack 不是 MakeSealed 友元,虛基類構造失敗
原理:虛基類由**最底層派生類**直接構造。MyClass 是友元可構造;Hack 繼承時需構造 MakeSealed,但非友元 → 編譯錯誤。
class FinalClass final {
public:
FinalClass() = default;
~FinalClass() = default;
};
// class Derived : public FinalClass {}; // 編譯錯誤:base class 'FinalClass' is marked final
| 方法 | 優點 | 缺點 | 適用版本 |
|---|---|---|---|
| 私有構造+工廠 | 簡單直觀 | 僅堆分配、手動釋放、無法聚合 | C++98+ |
| 虛繼承+友元 | 棟上/堆均可、自然語法 | 模板語法稍複雜、虛繼承開銷 | C++03+ |
final 關鍵字 | 標準、零開銷、語意清晰 | 需 C++11 | C++11+ |
現代 C++ 直接用 final。若受限於老標準,「虛繼承 + 友元」是唯一支援棟上創建且語法自然的方案;「私有構造 + 工廠」適合單例等特定場景。理解虛基類由最底層派生類構造的規則,是掌握該技巧的關鍵。