JZ-C-48

剑指offer第四十八题:不能被继承的类:用C++设计一个不能被继承的类(如C#里关键字Sealed,Java里关键字final)

 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 }

 

posted @ 2016-06-28 19:43  Laughing_Lz  阅读(...)  评论(... 编辑 收藏