利用「虛基類構造函數私有 + 友元」技巧,可在無 final 關鍵字(C++11 引入)的編譯器上實現「不可繼承」的類。
class FinalParent {
protected:
FinalParent() {} // 構造函數 protected,僅派生類可訪問
friend class FinalClass; // 授權 FinalClass 可構造
};
class FinalClass : private virtual FinalParent {
int num;
public:
FinalClass() { num = 5; }
void show() { cout << num << endl; }
};
FinalParent 構造函數 protected,外部無法直接構造,只有派生類能調用。FinalClass 以 private virtual 繼承 FinalParent,並被聲明為 friend,因此 FinalClass 可構造虛基類子對象。FinalClass(如 class Derived : public FinalClass),Derived 需構造虛基類 FinalParent,但 Derived 不是 FinalParent 的友元,編譯報錯。class FinalClass final,更簡潔明確。