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)然后父类剩下的没有覆盖掉的虚函数地址放在第一张虚函数表中。

posted @ 2023-09-07 11:29  一日学一日功  阅读(25)  评论(0)    收藏  举报