获取虚函数表指针

来源:互联网 发布:网络科学相关论文 编辑:程序博客网 时间:2024/05/29 16:32


/*  获取虚函数表指针。*/#include<iostream>using namespace std;class Stu{public:virtual void go1(){cout << "走来..." << endl;}virtual void go2(){cout << "跑来..." << endl;}virtual void go3(){cout << "飞来..." << endl;}};class MyStu :public Stu{virtual void go1(){cout << "my走来..." << endl;}virtual void go2(){cout << "my跑来..." << endl;}virtual void go3(){cout << "my飞来..." << endl;}};void main(){Stu *p = new MyStu;cout << sizeof(*p) << endl; //内容 *pcout << p << endl;//对象的地址cout << (void *)p << endl;//对象的地址cout << *(int *)p << endl;//虚函数的地址,当做整数读出。cout << (void *)(    *(int *)p  ) << endl;//虚函数表的地址。cout << (void *)(    *((int *)*(int *)p +0) ) << endl;  //取出第一个元素的地址/*p:是个指针。(int *)p:转换成 int 类型的指针*(int *)p:把转换成int 类型指针p 的内容取出(int *)( *(int *)p): 在转换成 int 类型的指针 (int *)( *(int *)p) +0: 取出第一个元素的地址*((int *)( *(int *)p) +0):得到第一个元素的内容(void *)(*((int *)( *(int *)p) +0));得到第一个元素的地址*/cout << (void *)(*((int *)*(int *)p + 1)) << endl;  //取出第一个元素的cout << (void *)(*((int *)*(int *)p + 2)) << endl;  //取出第一个元素的auto fun1 = (void *)(*((int *)*(int *)p + 0));auto fun2 = (void *)(*((int *)*(int *)p + 1));auto fun3 = (void *)(*((int *)*(int *)p + 3));typedef void (*P)();P Pfun[3];//函数指针数组for (int i = 0; i < 3; i++){Pfun[i] = (P)(void *)(*((int *)*(int *)p + i));//强转成 P 类型Pfun[i](); //调用}cin.get();}void main04_A(){cout << sizeof(Stu) << endl;Stu *p = new MyStu;cin.get();}


0 0
原创粉丝点击