类的析构及虚析构探究

正常析构及析构在多继承基类中产生的不足

  1. #include <iostream>
  2. using namespace std;
  3. //////////////////////////////////////////////////////////////////////////
  4. // 正常析构解决不了父类new子类时析构函数调用的问题
  5. // 也就是构造函数被调用了四次,而析构函数却被调用了三次
  6. //
  7. // 正常析构不能解决父子类同台出现的某些极端情况
  8. /*
  9. class A
  10. class B
  11. class A
  12. class B
  13. first delete A
  14. class ~A
  15. second delete B
  16. class ~B
  17. class ~A
  18. */
  19. class A
  20. {
  21. public:
  22. A()
  23. {
  24. cout << "class A" << endl;
  25. }
  26. ~A()
  27. {
  28. cout << "class ~A" << endl;
  29. }
  30. };
  31. class B: public A
  32. {
  33. public:
  34. B()
  35. {
  36. cout << "class B" << endl;
  37. }
  38. ~B()
  39. {
  40. cout << "class ~B" << endl;
  41. }
  42. };
  43. int main1()
  44. {
  45. A* a = new B();
  46. B* b = new B();
  47. cout << "first delete A" << endl;
  48. delete a;
  49. cout << "second delete B" << endl;
  50. delete b;
  51. return 0;
  52. }

虚析构能解决上述所产生的问题

  1. #include <iostream>
  2. using namespace std;
  3. //////////////////////////////////////////////////////////////////////////
  4. // 用虚基类析构函数能解决正常析构函数不能解放完的问题
  5. /*
  6. class AA
  7. class BB
  8. class AA
  9. class BB
  10. fir delete delete
  11. class ~BB
  12. class ~AA
  13. sec delete delete
  14. class ~BB
  15. class ~AA
  16. */
  17. class AA
  18. {
  19. public:
  20. AA()
  21. {
  22. cout << "class AA" << endl;
  23. }
  24. virtual ~AA()
  25. {
  26. cout << "class ~AA" << endl;
  27. }
  28. };
  29. class BB :public AA
  30. {
  31. public:
  32. BB()
  33. {
  34. cout << "class BB" << endl;
  35. }
  36. ~BB()
  37. {
  38. cout << "class ~BB" << endl;
  39. }
  40. };
  41. int main()
  42. {
  43. AA* a = new BB();
  44. BB* b = new BB();
  45. cout << "fir delete delete" << endl;
  46. delete a;
  47. cout << "sec delete delete" << endl;
  48. delete b;
  49. return 0;
  50. }




posted @ 2016-06-14 07:48  -刀狂剑痴-  阅读(258)  评论(0编辑  收藏  举报