首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 實現不可繼承的類:私有構造函數與虛繼承友元兩種模式

     編輯:C++ 入門

需求背景

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);

缺點:無法在棧上創建對象,需手動管理生命週期,使用不便。

方法二:虛繼承 + 友元類(C++03 可用)


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,但非友元 → 編譯錯誤。

C++11 標準寫法

class FinalClass final {
public:
    FinalClass() = default;
    ~FinalClass() = default;
};
// class Derived : public FinalClass {}; // 編譯錯誤:base class 'FinalClass' is marked final

對比總結

方法優點缺點適用版本
私有構造+工廠簡單直觀僅堆分配、手動釋放、無法聚合C++98+
虛繼承+友元棟上/堆均可、自然語法模板語法稍複雜、虛繼承開銷C++03+
final 關鍵字標準、零開銷、語意清晰需 C++11C++11+

總結

現代 C++ 直接用 final。若受限於老標準,「虛繼承 + 友元」是唯一支援棟上創建且語法自然的方案;「私有構造 + 工廠」適合單例等特定場景。理解虛基類由最底層派生類構造的規則,是掌握該技巧的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved