首页
社区
课程
招聘
[旧帖] [分享]C++对象之内存布局 希望能给邀请码!! 0.00雪花
发表于: 2010-4-21 23:04 2123

[旧帖] [分享]C++对象之内存布局 希望能给邀请码!! 0.00雪花

2010-4-21 23:04
2123
01 #include "stdio.h"  

02   

03 class Class1  

04 {  

05     public :  

06         int m_data1;  

07         int m_data2;  

08         void memfunc();  

09         virtual void vfunc1(){printf("i'm vfun1!");};  

10         virtual void vfunc2(){};  

11         virtual void vfunc3(){};  

12 };  

13   

14 void Class1::memfunc()  

15 {  

16     printf("memfunc");  

17 }  

18   

19 int main(int,char**,char**){  

20   

21     Class1 cls;  

22     cls.m_data1 = 1;  

23     cls.m_data2 = 2;  

24   

25     __asm{  

26 //      int 0x3  

27     }  

28   

29     printf("size:%d byte\n",sizeof(cls));  

30   

31     printf("m_data1 addr:0x%08x\n",(int)&cls+4);  
//&cls是地址 要先转换为int再加4 否则就是+ 4*sizeof(cls)了  

32     printf("m_data1 val:%d\n",*(int *)((int)&cls+4));
//要取值 先要把该地址转换成int* 然后再用*去取值  

33   

34     printf("m_data2 addr:0x%08x\n",(int)&cls+8);  

35     printf("m_data2 val:%d\n",*(int *)((int)&cls+8));  

36   

37     printf("call vfunc1:");  

38   

39     int addr;  

40     addr = *(int*)*(int*)(int)&cls;  
//先取出cls的地址 然后*获取地址中的vptr  通过vptr获取vtable 通过vtable获取vfun1的地址  

41     void (*pfun)(void);  

42   

43     __asm{  

44         mov eax,addr  

45         mov pfun,eax  

46     }  

47   

48     (*pfun)();  

49   

50     return 0;  

51 }

======================================================

1 如果你想在派生类中重新定义一个成员函数,那么应该在基类中把这个函数设为virtual(虚函数)。如果基类中的virtual function是纯虚函数,vritual fun() = 0; 那么基类将成为抽象类,抽象类不能被实例化,如果该抽象类的派生类没有实现继承的纯虚函数,那么派生类也将成为一个抽象类。

2 以相同的语句,却能调用不同的函数,就是Polymorphism,对,多态。

3 虚拟函数是c++的多态性质以及动态绑定的关键。  动态绑定又称为后端绑定,相对于前端绑定而言,前端绑定是指在编译时,编译器就将c或c++的non-virtual函数转换为一个固定地址的call指令了。

4 如果抽象类中的虚函数不打算被调用,就应该设置为纯虚函数。(在声明之后加上“=0”)

5 抽象类不能实例化,但我们可以定义抽象类为类型的指针,使用该指针,我们可以调用抽象类之派生类的实体的方法。

6 虚函数派生下去仍为虚函数,即使没有virtual关键字。

亲爱的管理,给个邀请码吧。
别让贴沉下去了。55

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 87
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶一贴,不想沉。。
2010-4-22 11:43
0
雪    币: 826
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持下,就是看不懂啊
2010-4-22 12:52
0
游客
登录 | 注册 方可回帖
返回
//