1. 1.为什么基类的析构函数是虚函数?

  在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。


  1. 1 只能在堆上创建对象(不能被继承,不能再栈上创建对象)  

  2.  将类的构造函数声明为private,但是为了  

  3.  创建该类的对象,则必须提供创建对象和释放对象的接口,  

  4.  用static函数成员实现。  

  5. #include<iostream>  

  6. usingnamespace std;    

  7. class HeapOnly    

  8. {    

  9. public:    

  10. static HeapOnly *CreateInstance()  

  11.    {    

  12.        HeapOnly * obj=new HeapOnly;    

  13.        obj->m=2;    

  14. return obj;    

  15.    }    

  16. staticvoid DeleteInstance(HeapOnly * obj)  

  17.    {    

  18. if(obj!=NULL)    

  19. delete obj;    

  20.    }  

  21. private:    

  22.    HeapOnly(){};    

  23.    ~HeapOnly(){};  

  24. public:  

  25. int m;  

  26. };    

  27. int main()    

  28. {    

  29.    HeapOnly *obj=HeapOnly::CreateInstance();    

  30.    cout<<obj->m<<endl;    

  31.    HeapOnly::DeleteInstance(obj);    

  32. //HeapOnly test; //error

  33.    system("pause");    

  34. return 0;    

  35. }  

  36. 2 只能在栈上创建对象(不能在堆上创建对象)  

  37.  思路:在堆上创建对象要用到new,为了在内外不能使用new,把new重载为私有  

  38. #include <iostream>  

  39. usingnamespace std;    

  40. class   StackOnly    

  41. {    

  42. public:    

  43.    StackOnly() {  

  44.        cout <<   "constructor."  <<   endl;  

  45.    }    

  46.    ~StackOnly()  

  47.    {  

  48.        cout << "destructor." <<   endl;    

  49.    }    

  50. private:    

  51. void*   operator   new   (size_t size);    

  52. };    

  53. int main()    

  54. {    

  55.    StackOnly   s;                                                    

  56. //StackOnly   *p   =   new   StackOnly; // error                        

  57. return   0;    

  58. }  

  59. 3 不能被继承、能在堆上创建对象,也能在栈上创建对象  

  60. // NotInheritClass 类是不能被继承、能在堆上创建对象,也能在栈上创建对象

  61. #include <iostream>  

  62. usingnamespace std;    

  63. template <typename T>  

  64. class MakeFinal  

  65. {  

  66. friend T;  

  67. private:  

  68.    MakeFinal() { cout << "MakeFinal "<<endl; }  

  69.    ~MakeFinal() { cout << "~MakeFinal "<<endl; }  

  70. };  

  71. class NotInheritClass: virtualpublic MakeFinal<NotInheritClass>  

  72. {  

  73. public:  

  74.    NotInheritClass(){ cout << "NotInheritClass "<<endl; }  

  75.    ~NotInheritClass(){ cout << "~NotInheritClass "<<endl; }  

  76. };  

  77. // class Test:public NotInheritClass // 继承失败

  78. // {

  79. // public:

  80. //  Test(){};

  81. //  ~Test(){};

  82. // };

  83. int main()  

  84. {    

  85.    NotInheritClass test1;  

  86.    NotInheritClass *test2 = new NotInheritClass;  

  87. delete test2;  

  88. return 0;  

  89. }  

  90. // 由于类 NotInheritClass 是从类 MakeFinal <NotInheritClass> 虚继承过来的,

  91. // 在调用 Test 的构造函数的时候,

  92. // 会直接跳过 NotInheritClass 而直接调用 MakeFinal <NotInheritClass> 的构造函数。

  93. // 非常遗憾的是, Test 不是 MakeFinal <NotInheritClass> 的友元,

  94. // 因此不能调用其私有的构造函数。

  95. // 基于上面的分析,试图从NotInheritClass 继承的类,一旦实例化,

  96. // 都会导致编译错误,因此NotInheritClass 不能被继承。这就满足了我们设计要求。