06从汇编的角度深入理解c++_11种虚函数继承时内存结构(重点)
1、单继承无函数覆盖
#include "stdafx.h"
struct Base{
public:
virtual void Function_1(){
printf("Base:Function_1\n");
}
virtual void Function_2(){
printf("Base:Function_2\n");
}
virtual void Function_3(){
printf("Base:Function_3\n");
}
};
struct Sub:Base{
public:
virtual void Function_4(){
printf("Sub:Function_4\n");
}
virtual void Function_5(){
printf("Sub:Function_5\n");
}
virtual void Function_6(){
printf("Sub:Function_6\n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Sub s1;
Sub* Temp = &s1;
int* ThisMe = (int*)Temp;
typedef void (*FunDef)();
FunDef Funcall;
printf("%d\n",sizeof(s1));//4
printf("%08x----->",*ThisMe);//4
for(int i=0;i<6;i++)
{
printf("%08x\n",*((int*)(*ThisMe)+i));
Funcall = (FunDef)(*((int*)(*ThisMe)+i));
Funcall();
}
getchar();
return 0;
}

2、单继承有函数覆盖
#include "stdafx.h"
struct Base{
public:
virtual void Function_1(){
printf("Base:Function_1\n");
}
virtual void Function_2(){
printf("Base:Function_2\n");
}
virtual void Function_3(){
printf("Base:Function_3\n");
}
};
struct Sub:Base{
public:
virtual void Function_1(){
printf("Sub:Function_1\n");
}
virtual void Function_2(){
printf("Sub:Function_2\n");
}
virtual void Function_6(){
printf("Sub:Function_6\n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Sub s1;
Sub* Temp = &s1;
int* ThisMe = (int*)Temp;
typedef void (*FunDef)();
FunDef Funcall;
printf("%d\n",sizeof(s1));//4
printf("%08x----->",*ThisMe);//4
for(int i=0;i<4;i++)
{
printf("%08x\n",*((int*)(*ThisMe)+i));
Funcall = (FunDef)(*((int*)(*ThisMe)+i));
Funcall();
}
getchar();
return 0;
}

3、多层继承无函数覆盖
#include "stdafx.h"
struct Base1{
public:
virtual void Function_1(){
printf("Base1:Function_1\n");
}
virtual void Function_2(){
printf("Base1:Function_2\n");
}
};
struct Base2:Base1{
public:
virtual void Function_3(){
printf("Base2:Function_3\n");
}
virtual void Function_4(){
printf("Base2:Function_4\n");
}
};
struct Sub:Base2{
public:
virtual void Function_5(){
printf("Sub:Function_5\n");
}
virtual void Function_6(){
printf("Sub:Function_6\n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Sub s1;
Sub* Temp = &s1;
int* ThisMe = (int*)Temp;
typedef void (*FunDef)();
FunDef Funcall;
printf("%d\n",sizeof(s1));//4
printf("%08x----->",*ThisMe);//4
int i=0;
while(*((int*)(*ThisMe)+i)!=0x00000000)
{
printf("%08x\n",*((int*)(*ThisMe)+i));
Funcall = (FunDef)(*((int*)(*ThisMe)+i));
Funcall();
i++;
}
getchar();
return 0;
}

4、多层继承有函数覆盖1
#include "stdafx.h"
struct Base1{
public:
virtual void Function_1(){
printf("Base1:Function_1\n");
}
virtual void Function_2(){
printf("Base1:Function_2\n");
}
};
struct Base2:Base1{
public:
virtual void Function_1(){
printf("Base2:Function_1\n");
}
virtual void Function_3(){
printf("Base2:Function_3\n");
}
};
struct Sub:Base2{
public:
virtual void Function_5(){
printf("Sub:Function_5\n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Sub s1;
Sub* Temp = &s1;
int* ThisMe = (int*)Temp;
typedef void (*FunDef)();
FunDef Funcall;
printf("%d\n",sizeof(s1));//4
printf("%08x----->",*ThisMe);//4
int i=0;
while(*((int*)(*ThisMe)+i)!=0x00000000)
{
printf("%08x\n",*((int*)(*ThisMe)+i));
Funcall = (FunDef)(*((int*)(*ThisMe)+i));
Funcall();
i++;
}
getchar();
return 0;
}

5、多层继承有函数覆盖2
#include "stdafx.h"
struct Base1{
public:
virtual void Function_1(){
printf("Base1:Function_1\n");
}
virtual void Function_2(){
printf("Base1:Function_2\n");
}
};
struct Base2:Base1{
public:
virtual void Function_1(){
printf("Base2:Function_1\n");
}
virtual void Function_3(){
printf("Base2:Function_3\n");
}
};
struct Sub:Base2{
public:
virtual void Function_1(){
printf("Sub:Function_1\n");
}
virtual void Function_5(){
printf("Sub:Function_5\n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Sub s1;
Sub* Temp = &s1;
int* ThisMe = (int*)Temp;
typedef void (*FunDef)();
FunDef Funcall;
printf("%d\n",sizeof(s1));//4
printf("%08x----->",*ThisMe);//4
int i=0;
while(*((int*)(*ThisMe)+i)!=0x00000000)
{
printf("%08x\n",*((int*)(*ThisMe)+i));
Funcall = (FunDef)(*((int*)(*ThisMe)+i));
Funcall();
i++;
}
getchar();
return 0;
}

6、多层继承有函数覆盖3
#include "stdafx.h"
struct Base1{
public:
virtual void Function_1(){
printf("Base1:Function_1\n");
}
virtual void Function_2(){
printf("Base1:Function_2\n");
}
};
struct Base2:Base1{
public:
virtual void Function_3(){
printf("Base2:Function_3\n");
}
};
struct Sub:Base2{
public:
virtual void Function_1(){
printf("Sub:Function_1\n");
}
virtual void Function_3(){
printf("Sub:Function_3\n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Sub s1;
Sub* Temp = &s1;
int* ThisMe = (int*)Temp;
typedef void (*FunDef)();
FunDef Funcall;
printf("%d\n",sizeof(s1));//4
printf("%08x----->",*ThisMe);//4
int i=0;
while(*((int*)(*ThisMe)+i)!=0x00000000)
{
printf("%08x\n",*((int*)(*ThisMe)+i));
Funcall = (FunDef)(*((int*)(*ThisMe)+i));
Funcall();
i++;
}
getchar();
return 0;
}

7、多重继承无函数覆盖1
#include "stdafx.h"
struct Base1{
public:
virtual void Function_1(){
printf("Base1:Function_1\n");
}
virtual void Function_2(){
printf("Base1:Function_2\n");
}
};
struct Base2{
public:
virtual void Function_3(){
printf("Base2:Function_3\n");
}
virtual void Function_4(){
printf("Base2:Function_4\n");
}
};
struct Base3{
public:
virtual void Function_5(){
printf("Base3:Function_5\n");
}
virtual void Function_6(){
printf("Base3:Function_6\n");
}
};
struct Sub:Base1,Base2,Base3{
public:
virtual void Function_7(){
printf("Sub:Function_7\n");
}
virtual void Function_8(){
printf("Sub:Function_8\n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Sub s1;
Sub* Temp = &s1;
int* ThisMe = (int*)Temp;
typedef void (*FunDef)();
FunDef Funcall;
printf("%d\n",sizeof(s1));//0xC
printf("%08x-->",*ThisMe);
for(int i=0;i<4;i++)
{
printf("%08x\n",*((int*)(*ThisMe)+i));
Funcall = (FunDef)(*((int*)(*ThisMe)+i));
Funcall();
}
printf("%08x----->",*(ThisMe+1));
for(int i=0;i<2;i++)
{
printf("%08x\n",*((int*)(*(ThisMe+1))+i));
Funcall = (FunDef)(*((int*)(*(ThisMe+1))+i));
Funcall();
}
printf("%08x----->",*(ThisMe+2));
for(int i=0;i<2;i++)
{
printf("%08x\n",*((int*)(*(ThisMe+2))+i));
Funcall = (FunDef)(*((int*)(*(ThisMe+2))+i));
Funcall();
}
getchar();
return 0;
}

8、多重继承无函数覆盖2
#include "stdafx.h"
struct Base1{
public:
virtual void Function_1(){
printf("Base1:Function_1\n");
}
virtual void Function_2(){
printf("Base1:Function_2\n");
}
};
struct Base2{
public:
virtual void Function_3(){
printf("Base2:Function_3\n");
}
virtual void Function_4(){
printf("Base2:Function_4\n");
}
};
struct Sub:Base1,Base2{
public:
virtual void Function_5(){
printf("Sub:Function_5\n");
}
virtual void Function_6(){
printf("Sub:Function_6\n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Sub s1;
Sub* Temp = &s1;
int* ThisMe = (int*)Temp;
typedef void (*FunDef)();
FunDef Funcall;
printf("%d\n",sizeof(s1));//0x8
printf("%08x-->",*ThisMe);
for(int i=0;i<4;i++)
{
printf("%08x\n",*((int*)(*ThisMe)+i));
Funcall = (FunDef)(*((int*)(*ThisMe)+i));
Funcall();
}
printf("%08x----->",*(ThisMe+1));
for(int i=0;i<2;i++)
{
printf("%08x\n",*((int*)(*(ThisMe+1))+i));
Funcall = (FunDef)(*((int*)(*(ThisMe+1))+i));
Funcall();
}
getchar();
return 0;
}

9、多重继承有函数覆盖(1)
#include "stdafx.h"
struct Base1{
public:
virtual void Function_1(){
printf("Base1:Function_1\n");
}
virtual void Function_2(){
printf("Base1:Function_2\n");
}
};
struct Base2{
public:
virtual void Function_3(){
printf("Base2:Function_3\n");
}
virtual void Function_4(){
printf("Base2:Function_4\n");
}
};
struct Sub:Base1,Base2{
public:
virtual void Function_1(){
printf("Sub:Function_1\n");
}
virtual void Function_3(){
printf("Sub:Function_3\n");
}
virtual void Function_5(){
printf("Sub:Function_5\n");
}
virtual void Function_6(){
printf("Sub:Function_6\n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Sub s1;
Sub* Temp = &s1;
int* ThisMe = (int*)Temp;
typedef void (*FunDef)();
FunDef Funcall;
printf("%d\n",sizeof(s1));//0x8
printf("%08x-->",*ThisMe);
for(int i=0;i<4;i++)
{
printf("%08x\n",*((int*)(*ThisMe)+i));
Funcall = (FunDef)(*((int*)(*ThisMe)+i));
Funcall();
}
printf("%08x----->",*(ThisMe+1));
for(int i=0;i<2;i++)
{
printf("%08x\n",*((int*)(*(ThisMe+1))+i));
Funcall = (FunDef)(*((int*)(*(ThisMe+1))+i));
Funcall();
}
getchar();
return 0;

10、多重继承有函数覆盖(2)
#include "stdafx.h"
struct Base1{
public:
virtual void Function_1(){
printf("Base1:Function_1\n");
}
virtual void Function_2(){
printf("Base1:Function_2\n");
}
};
struct Base2{
public:
virtual void Function_1(){
printf("Base2:Function_1\n");
}
virtual void Function_3(){
printf("Base2:Function_3\n");
}
virtual void Function_4(){
printf("Base2:Function_4\n");
}
};
struct Base3{
public:
virtual void Function_1(){
printf("Base3:Function_1\n");
}
virtual void Function_2(){
printf("Base3:Function_2\n");
}
};
struct Sub:Base1,Base2,Base3{
public:
virtual void Function_1(){
printf("Sub:Function_1\n");
}
virtual void Function_3(){
printf("Sub:Function_3\n");
}
virtual void Function_5(){
printf("Sub:Function_5\n");
}
virtual void Function_6(){
printf("Sub:Function_6\n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Sub s1;
Sub* Temp = &s1;
int* ThisMe = (int*)Temp;
typedef void (*FunDef)();
FunDef Funcall;
printf("%d\n",sizeof(s1));//0xC
printf("%08x-->",*ThisMe);
for(int i=0;i<4;i++)
{
printf("%08x\n",*((int*)(*ThisMe)+i));
Funcall = (FunDef)(*((int*)(*ThisMe)+i));
Funcall();
}
printf("%08x----->",*(ThisMe+1));
for(int i=0;i<3;i++)
{
printf("%08x\n",*((int*)(*(ThisMe+1))+i));
Funcall = (FunDef)(*((int*)(*(ThisMe+1))+i));
Funcall();
}
printf("%08x----->",*(ThisMe+2));
for(int i=0;i<2;i++)
{
printf("%08x\n",*((int*)(*(ThisMe+2))+i));
Funcall();
}
getchar();
return 0;
}

11、多重继承有函数覆盖(3)
#include "stdafx.h"
struct Base1{
public:
virtual void Function_1(){
printf("Base1:Function_1\n");
}
virtual void Function_2(){
printf("Base1:Function_2\n");
}
};
struct Base2{
public:
virtual void Function_1(){
printf("Base2:Function_1\n");
}
virtual void Function_3(){
printf("Base2:Function_3\n");
}
virtual void Function_5(){
printf("Base2:Function_5\n");
}
};
struct Base3{
public:
virtual void Function_1(){
printf("Base3:Function_1\n");
}
virtual void Function_2(){
printf("Base3:Function_2\n");
}
};
struct Sub:Base1,Base2,Base3{
public:
virtual void Function_1(){
printf("Sub:Function_1\n");
}
virtual void Function_3(){
printf("Sub:Function_3\n");
}
virtual void Function_5(){
printf("Sub:Function_5\n");
}
virtual void Function_6(){
printf("Sub:Function_6\n");
} 0x00415790
}; 0x00415778
0x00415768
int _tmain(int argc, _TCHAR* argv[])
{
Sub s1;
Sub* Temp = &s1;
int* ThisMe = (int*)Temp;
typedef void (*FunDef)();
FunDef Funcall;
printf("%d\n",sizeof(s1));//0xC
printf("%08x-->",*ThisMe);
for(int i=0;i<3;i++)
{
printf("%08x\n",*((int*)(*ThisMe)+i));
Funcall = (FunDef)(*((int*)(*ThisMe)+i));
Funcall();
}
printf("%08x----->",*(ThisMe+1));
for(int i=0;i<3;i++)
{
printf("%08x\n",*((int*)(*(ThisMe+1))+i));
Funcall = (FunDef)(*((int*)(*(ThisMe+1))+i));
Funcall();
}
printf("%08x----->",*(ThisMe+2));
for(int i=0;i<2;i++)
{
printf("%08x\n",*((int*)(*(ThisMe+2))+i));
Funcall = (FunDef)(*((int*)(*(ThisMe+2))+i));
Funcall();
}
getchar();
return 0;
}

总结:
1、对于单层、多层继承,子类都是1张虚表存储。
2、对于单层、多层继承,对于有覆盖的情况,子类中的虚函数地址会覆盖掉所有父类中的虚函数地址。
3、对于多重继承,有几个父类,就有几张虚表。
4、对于多重继承,子类虚函数覆盖步骤:
1)父类先分别把父类中的虚函数地址覆盖掉子类中同名的虚函数。
2)然后父类剩下的没有覆盖掉的虚函数地址放在第一张虚函数表中。

浙公网安备 33010602011771号