昨天去XX公司面试,面试官问了一个关于C++类析构函数为虚函数时,如果是父类的指针用子类来new,如果发生析构时,析构函数是virtual与不是virtual有什么区别。当时答的不好,回来总结了一下,在机器上实现了一遍,终于搞明白了。记录下来,以后遇到这种情况自己一定不要犯错了
一、先看第一种最简单的情况吧,教科书上教的,析构函数不是virtual,正常定义一个子类对象
class student
{
public:
int *m_pInt;
student()
{
m_pInt = new int[10]; //1
memset(m_pInt, 0, 10*4);
}
~student()
{ //3
delete []m_pInt;
}
};
class GradeOneStue:public student
{
public:
int m_iNum;
GradeOneStue()
{ //2
m_iNum = 1;
}
~GradeOneStue()
{ //4
m_iNum = 0;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
GradeOneStue gd;
return 0;
}
这时构造顺序是先1后2,下面是反汇编代码
GradeOneStue()
00411470 push ebp
00411471 mov ebp,esp
00411473 sub esp,0CCh
00411479 push ebx
0041147A push esi
0041147B push edi
0041147C push ecx
0041147D lea edi,[ebp-0CCh]
00411483 mov ecx,33h
00411488 mov eax,0CCCCCCCCh
0041148D rep stos dword ptr es:[edi]
0041148F pop ecx
00411490 mov dword ptr [ebp-8],ecx
00411493 mov ecx,dword ptr [thi