【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

继承是类的一个基本属性,可是在类的继承过程中,函数是怎么初始化?怎么析构的呢?我们不妨看看下面这样的一段代码?

class employee
{
public:employee() { printf("employee()!\n");}~employee() { printf("~employee()!\n");}
};class manager : public employee
{
public:manager() { printf("manager()!\n");}~manager() {  printf("~maneger()!\n");}
};

看到上面的代码,相信大家也明白了,我们定义了这样一个类。基类是empoyee,继承类是manager。我们看到manager是一种特殊的employee,那么在内存构建和析构的时候函数又是怎么安排的呢?

74:       manager m;
00401268   lea         ecx,[ebp-4]
0040126B   call        @ILT+60(manager::manager) (00401041)
75:   }
00401270   lea         ecx,[ebp-4]
00401273   call        @ILT+0(manager::~manager) (00401005)
00401278   pop         edi
00401279   pop         esi
0040127A   pop         ebx
0040127B   add         esp,44h
0040127E   cmp         ebp,esp
00401280   call        __chkesp (00408760)
00401285   mov         esp,ebp
00401287   pop         ebp

我们发现manager的构造和析构其实也简单。构造函数其实就是在变量出现的时候进行构造。那什么时候析构呢?也就在函数快结束的时候进行析构。下面我们可以进一步讨论在manager的构造和析构究竟是怎么做的?

65:   class manager : public employee
66:   {
67:   public:
68:       manager() { printf("manager()!\n");}
004012A0   push        ebp
004012A1   mov         ebp,esp
004012A3   sub         esp,44h
004012A6   push        ebx
004012A7   push        esi
004012A8   push        edi
004012A9   push        ecx
004012AA   lea         edi,[ebp-44h]
004012AD   mov         ecx,11h
004012B2   mov         eax,0CCCCCCCCh
004012B7   rep stos    dword ptr [edi]
004012B9   pop         ecx
004012BA   mov         dword ptr [ebp-4],ecx
004012BD   mov         ecx,dword ptr [ebp-4]
004012C0   call        @ILT+40(employee::employee) (0040102d)
004012C5   push        offset string "manager()!\n" (00431020)
004012CA   call        printf (004086e0)
004012CF   add         esp,4
004012D2   mov         eax,dword ptr [ebp-4]
004012D5   pop         edi
004012D6   pop         esi
004012D7   pop         ebx
004012D8   add         esp,44h
004012DB   cmp         ebp,esp
004012DD   call        __chkesp (00408760)
004012E2   mov         esp,ebp
004012E4   pop         ebp
004012E5   ret

我们发现,manager的构造里面添加了employee的缺省构造函数,那么析构函数呢?

69:       ~manager() {  printf("~maneger()!\n");}
00401350   push        ebp
00401351   mov         ebp,esp
00401353   sub         esp,44h
00401356   push        ebx
00401357   push        esi
00401358   push        edi
00401359   push        ecx
0040135A   lea         edi,[ebp-44h]
0040135D   mov         ecx,11h
00401362   mov         eax,0CCCCCCCCh
00401367   rep stos    dword ptr [edi]
00401369   pop         ecx
0040136A   mov         dword ptr [ebp-4],ecx
0040136D   push        offset string "~maneger()!\n" (00431040)
00401372   call        printf (004086e0)
00401377   add         esp,4
0040137A   mov         ecx,dword ptr [ebp-4]
0040137D   call        @ILT+5(employee::~employee) (0040100a)
00401382   pop         edi
00401383   pop         esi
00401384   pop         ebx
00401385   add         esp,44h
00401388   cmp         ebp,esp
0040138A   call        __chkesp (00408760)
0040138F   mov         esp,ebp
00401391   pop         ebp
00401392   ret

我们发现,manager构造的时候employee率先构造,然后打印manager;析构的时候,恰恰相反,manager首先析构自己,然后在再调用employee的析构函数,上面的汇编代码证明了一切。

【预告:下面主要讨论类的虚函数】

用汇编的眼光看C++(之类继承)相关推荐

  1. 用汇编的眼光看C++(之 总结篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 早在八月份的时候,就陆陆续续写了二十多篇用汇编语言看C++的博客内容.在此为了做一个概括,也为 ...

  2. 用汇编的眼光看C++(之退出流程)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 无论是在判断还是在循环的过程中,通常在遇到合适的条件的时候就会退出相应的模块.跳出模块运行的方 ...

  3. 用汇编的眼光看C++ (之x86汇编)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 说到用汇编的眼光看C++语言,那么怎么阅读汇编代码就成了我们需要解决的一个问题.其实,实话说, ...

  4. 用汇编的眼光看C++(之模板类)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 如果类是一种确定的数据类型,那么模板就是一种对类的抽象.假设有这么一种类,它需要进行数据的计算 ...

  5. 用汇编的眼光看C++(之判断流程)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在我们平常的编程当中,用于判断的地方很多,但主要有下面三种方式:if-else:switch: ...

  6. 用汇编的眼光看C++(之拷贝、赋值函数)

    拷贝构造函数和复制函数是类里面比较重要的两个函数.两者有什么区别呢?其实也很简单,我们可以举个例子,加入有这样一个类的定义: [cpp] view plaincopy class apple { pu ...

  7. 用汇编的眼光看C++(之算术符重载陷阱)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在算术符重载里面,"="重载可能是最经常使用的一种.但是好多人就误以为在函 ...

  8. 从汇编的眼光看C++(之指针拷贝)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 指针是编程人员的梦魇,对C语言的开发者是如此,对C++的开发者也是如此.特别是在C++中,如果 ...

  9. 从汇编的眼光看C++(之递归函数与模板类)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 递归,相信有过基本C语言经验的朋友都明白,就是函数自己调用自己.所以,本质上说,它和普通的函数 ...

最新文章

  1. 机器学习的练功心法(一)——机器学习概述
  2. oracle数据分布不均,oracle性能优化操作七:索引提高数据分布不均匀时查询效率...
  3. hive case when语法_SQL中CASE表达式的妙用
  4. 1TB存储版iPhone 13 Pro机型预计交付时间已被推迟至10月
  5. 中职计算机课程教学,提高中职计算机课程教学效率的途径
  6. python中argsort_numpy的argsort函数
  7. 内存少导致编译出错,内存增加到24G
  8. 字节流和字符流的读写
  9. 矩阵分析与应用课程资料
  10. 解决Iframe嵌入帆软BI系统后,Chrome升级后跨域出现登录界面,Cookie写入不成功。解决办法
  11. PS2 键盘 变 USB 键盘 设计图
  12. python语言支持函数式编程_python 函数式编程学习笔记
  13. 2.跟我走吧,现在就出发
  14. Android 7.0拍照/相册/截取图片FileProvider使用
  15. 岁岁年年人不同——LVS2019多媒体会议见闻(一)
  16. 国际期货分仓软件 期货分仓系统 子账户系统 期货软件
  17. Uncaught ReferenceError: xxx is not defined at HTMLButtonElement.onclick
  18. Profili翼型数据导出至ICEM CFD
  19. PROE基本操作1(查看组件尺寸)
  20. 基于OCC+OSG的CAD之GMSH与Netgen网格连贯性测试

热门文章

  1. 关于ecplise中一些很实用的技巧
  2. Chrome 前端 插件
  3. [收藏]实践参考:parted创建硬盘分区并创建LVM
  4. 编译Android源码相关资源及文章
  5. Community Server架构:博客业务详细分析(转)
  6. BlackBerry 应用程序开发者指南 第一卷:基础--第8章 本地化应用程序
  7. Python学习 Day 040 - css选择器
  8. MVC HtmlHelper扩展——实现分页功能
  9. 带参数的插入语句的问题
  10. CYYMysql 源码解读 3