JZ-C-48

劍指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 }
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息