用汇编的眼光看C++(之类继承)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
继承是类的一个基本属性,可是在类的继承过程中,函数是怎么初始化?怎么析构的呢?我们不妨看看下面这样的一段代码?
copy to clipboardprint?class employee
{
public:
employee() { printf("employee()!\n");}
~employee() { printf("~employee()!\n");}
};
class manager : public employee
{
public:
manager() { printf("manager()!\n");}
~manager() { printf("~maneger()!\n");}
};
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,那么在内存构建和析构的时候函数又是怎么安排的呢?
copy to clipboardprint?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
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的构造和析构究竟是怎么做的?
copy to clipboardprint?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
65: class manager : public employee
66: {
67: public:
68: manager() { printf("manager()!\n");}
004012A0 push ebp
004012A1 mov &nbs
补充:软件开发 , C++ ,
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊