**#include <string.h>
#include <stdio.h>
#include <iostream>
#include <stdint.h>
class v_table
{
public:
virtual void f() {std::cout << "virtual func f" << std::endl;}
virtual void g() {std::cout << "virtual func g" << std::endl;}
virtual void h() {std::cout << "virtual func h" << std::endl;}
void m() {std::cout << "func m" << std::endl;;}
};
class v_table1 : public v_table
{
public:
virtual void f1() {std::cout << "virtual func f1" << std::endl;}
virtual void g1() {std::cout << "virtual func g1" << std::endl;}
virtual void h1() {std::cout << "virtual func h1" << std::endl;}
};
int main (int argc ,char * argv[])
{
printf("*************************************\n");
class v_table test;
printf("虚函数表地址\t %p \n",(int64_t*)*(int64_t*)&test);
printf("虚函数表第1个函数地址\t %p \n",(int64_t*)*(int64_t*)*(int64_t*)&test);
printf("虚函数表第2个函数地址\t %p \n",(int64_t*)*((int64_t*)*(int64_t*)&test +1));
printf("虚函数表第3个函数地址\t %p \n",(int64_t*)*((int64_t*)*(int64_t*)&test +2));
Fun pfun = (Fun)*(int64_t*)*(int64_t *)&test;
pfun();
pfun = NULL;
pfun = (Fun)*((int64_t*)*(int64_t *)(&test)+1);
pfun();
pfun = NULL;
pfun = (Fun)*((int64_t*)*(int64_t *)&test+2);
pfun();
class v_table1 test_drive;
printf("drive_test\n");
printf("虚函数表地址\t %p \n",(int64_t*)*(int64_t *)&test_drive);
printf("虚函数表第1个函数地址\t %p \n",(int64_t*)*(int64_t*)*(int64_t*)&test_drive);
printf("虚函数表第2个函数地址\t %p \n",(int64_t*)*((int64_t*)*(int64_t*)&test_drive +1));
printf("虚函数表第3个函数地址\t %p \n",(int64_t*)*((int64_t*)*(int64_t*)&test_drive +2));
printf("虚函数表第4个函数地址\t %p \n",(int64_t*)*((int64_t*)*(int64_t*)&test_drive +3));
printf("虚函数表第5个函数地址\t %p \n",(int64_t*)*((int64_t*)*(int64_t*)&test_drive +4));
printf("虚函数表第6个函数地址\t %p \n",(int64_t*)*((int64_t*)*(int64_t*)&test_drive +5));
//pfun = NULL;
pfun = (Fun)*((int64_t*)*(int64_t *)&test_drive+5);
pfun();
return 0;
}**
在这里插入代码片