劍指offer第四十八題:不能被繼承的類:用C++設計一個不能被繼承的類(如C#裏關鍵字Sealed,Java裏關鍵字final)ios
1 //============================================================================ 2 // Name : JZ-C-48.cpp 3 // Author : Laughing_Lz 4 // Version : 5 // Copyright : All Right Reserved 6 // Description : 不能被繼承的類:用C++設計一個不能被繼承的類(如C#裏關鍵字Sealed,Java裏關鍵字final) 7 //============================================================================ 8 9 #include <iostream> 10 using namespace std; 11 12 // ====================方法一:把構造函數設爲私有函數==================== 13 class SealedClass1 { 14 public: 15 static SealedClass1* GetInstance() { 16 return new SealedClass1(); 17 } 18 19 static void DeleteInstance(SealedClass1* pInstance) { 20 delete pInstance; 21 } 22 23 private: 24 SealedClass1() {//private 25 } 26 ~SealedClass1() {//private 27 } 28 }; 29 30 // 若是試圖從SealedClass1繼承出新的類型, 31 // 將會致使編譯錯誤。 32 /* 33 class Try1 : public SealedClass1 34 { 35 public: 36 Try1() {} 37 ~Try1() {} 38 }; 39 */ 40 41 // ====================方法二:利用虛擬繼承virtual==================== 42 template<typename T> class MakeSealed { 43 friend T;//友元類 44 45 private: 46 MakeSealed() { 47 } 48 ~MakeSealed() { 49 } 50 }; 51 52 class SealedClass2: virtual public MakeSealed<SealedClass2> {// 53 public: 54 SealedClass2() { 55 } 56 ~SealedClass2() { 57 } 58 }; 59 60 // 若是試圖從SealedClass1繼承出新的類型, 61 // 將會致使編譯錯誤。 62 /* 63 class Try2 : public SealedClass2 64 { 65 public: 66 Try2() {} 67 ~Try2() {} 68 }; 69 */ 70 71 int main(int argc, char** argv) { 72 return 0; 73 }