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直播授课