用汇编的眼光看C++(之类继承)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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++(之类继承)相关推荐
- 用汇编的眼光看C++(之 总结篇)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 早在八月份的时候,就陆陆续续写了二十多篇用汇编语言看C++的博客内容.在此为了做一个概括,也为 ...
- 用汇编的眼光看C++(之退出流程)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 无论是在判断还是在循环的过程中,通常在遇到合适的条件的时候就会退出相应的模块.跳出模块运行的方 ...
- 用汇编的眼光看C++ (之x86汇编)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 说到用汇编的眼光看C++语言,那么怎么阅读汇编代码就成了我们需要解决的一个问题.其实,实话说, ...
- 用汇编的眼光看C++(之模板类)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 如果类是一种确定的数据类型,那么模板就是一种对类的抽象.假设有这么一种类,它需要进行数据的计算 ...
- 用汇编的眼光看C++(之判断流程)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在我们平常的编程当中,用于判断的地方很多,但主要有下面三种方式:if-else:switch: ...
- 用汇编的眼光看C++(之拷贝、赋值函数)
拷贝构造函数和复制函数是类里面比较重要的两个函数.两者有什么区别呢?其实也很简单,我们可以举个例子,加入有这样一个类的定义: [cpp] view plaincopy class apple { pu ...
- 用汇编的眼光看C++(之算术符重载陷阱)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在算术符重载里面,"="重载可能是最经常使用的一种.但是好多人就误以为在函 ...
- 从汇编的眼光看C++(之指针拷贝)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 指针是编程人员的梦魇,对C语言的开发者是如此,对C++的开发者也是如此.特别是在C++中,如果 ...
- 从汇编的眼光看C++(之递归函数与模板类)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 递归,相信有过基本C语言经验的朋友都明白,就是函数自己调用自己.所以,本质上说,它和普通的函数 ...
最新文章
- 机器学习的练功心法(一)——机器学习概述
- oracle数据分布不均,oracle性能优化操作七:索引提高数据分布不均匀时查询效率...
- hive case when语法_SQL中CASE表达式的妙用
- 1TB存储版iPhone 13 Pro机型预计交付时间已被推迟至10月
- 中职计算机课程教学,提高中职计算机课程教学效率的途径
- python中argsort_numpy的argsort函数
- 内存少导致编译出错,内存增加到24G
- 字节流和字符流的读写
- 矩阵分析与应用课程资料
- 解决Iframe嵌入帆软BI系统后,Chrome升级后跨域出现登录界面,Cookie写入不成功。解决办法
- PS2 键盘 变 USB 键盘 设计图
- python语言支持函数式编程_python 函数式编程学习笔记
- 2.跟我走吧,现在就出发
- Android 7.0拍照/相册/截取图片FileProvider使用
- 岁岁年年人不同——LVS2019多媒体会议见闻(一)
- 国际期货分仓软件 期货分仓系统 子账户系统 期货软件
- Uncaught ReferenceError: xxx is not defined at HTMLButtonElement.onclick
- Profili翼型数据导出至ICEM CFD
- PROE基本操作1(查看组件尺寸)
- 基于OCC+OSG的CAD之GMSH与Netgen网格连贯性测试