[关闭]
@CrazyHenry 2018-02-20T21:15:41.000000Z 字数 1117 阅读 1087

15.x 虚析构函数和派生类构造函数

ccccC++Primer


  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <iterator>
  5. #include <algorithm>
  6. #include <typeinfo>
  7. #include <numeric>
  8. #include <memory>
  9. using namespace std;
  10. //win+<-/-> 切换窗口位置
  11. //ctrl+win+<-/->切换桌面
  12. //ctrl+alt+上/下 改变显示器方向
  13. class Base
  14. {
  15. public:
  16. int *p;
  17. Base():p(new int(10)){cout<<"Base cons"<<endl;}
  18. virtual ~Base()
  19. {
  20. delete p;
  21. cout<<"Base des"<<endl;
  22. }
  23. };
  24. class Derv : public Base
  25. {
  26. public:
  27. int *pp;
  28. Derv():Base(),pp(new int(20)){cout<<"Derv cons"<<endl;}
  29. ~Derv()
  30. {
  31. delete pp;
  32. cout<<"Derv des"<<endl;
  33. }
  34. };
  35. int main()
  36. {
  37. Base *bp = new Derv();
  38. cout<<*(bp->p)<<endl;
  39. cout<<"----------"<<endl;
  40. Derv *dp = static_cast<Derv*>(bp);
  41. cout<<*(dp->pp)<<endl;
  42. delete bp;
  43. bp = nullptr;
  44. dp = nullptr;
  45. return 0;
  46. }

image.png-15kB

注意,派生类的析构函数名和基类的析构函数名字不同。那么是否应该使用派生类的析构函数调用基类的析构函数呢?
答案是否定的,因为派生类的虚析构函数就是~Bulk_quote(),就是这个虚函数与基类的虚析构函数绑定,跳转就跳转到这里。
也就是说,delete itemP;会执行~Bulk_quote(),然后这个析构函数的函数体都执行之后,才会由编译器自动调用继承而来的~Base()。自己显式调用反而出错!

派生类的构造函数里可以写出基类的构造函数,也可以不写,不写的话基类部分将调用默认构造函数。

派生类的基类部分很多情况下都可以当成一个基类对象!比如构造和析构时的行为,基类指针与引用绑定的行为,以及友元的访问范围!
image.png-164kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注