在C#中定義了關鍵字sealed,被sealed修飾的類不能被繼承。在Java中同樣也有關鍵字final表示一個類型不能被繼承。在C++中沒有類似於sealed和final的關鍵字,所以我們只有自己來實現。
很多人都能夠想到,類的建構函式和解構函式是關鍵。因為子類的建構函式會自動調用父類的建構函式。子類的解構函式也會自動調用父類的解構函式。所以要想使一個類不能被繼承,只有把它的建構函式和解構函式都定義為私人函數或保護函數,那麼當一個類試圖從這個類繼承的時候,必然會先調用建構函式而產生編譯錯誤,從而導致繼承失敗。
這個不能被繼承類的建構函式和解構函式都是私人函數,那麼怎樣才能得到該類的執行個體呢? 這倒不難,可以通過定義公有的靜態函數來建立和釋放類的執行個體,實現該類不能被繼承但能被執行個體化的功能。
基於這個思路,我們可以寫出如下代碼:
#include<iostream>using namespace std;class SealedClass{private: // 私人成員SealedClass() { }; // 建構函式~SealedClass() { }; // 解構函式public:int m_number;static SealedClass* GetInstance(int number) // 用於構造的函數{SealedClass * pInstance = new SealedClass();pInstance->m_number = number;return pInstance;}static void DeleteInstance(SealedClass* pInstance) // 用於析構的函數{delete pInstance;pInstance = 0;}};int main(void){SealedClass * p = SealedClass::GetInstance(9);cout<<"m_number is : "<<p->m_number<<endl;SealedClass::DeleteInstance(p);cout<<"m_number is : "<<p->m_number<<endl; return 0;}
輸出結果如下: