C++虚指针和虚表
类中有虚函数,编译器就会为该类对象分配一个虚拟指针,虚拟指针指向一个全局(该类所拥有)
的虚函数表。
vptr 指向 vtable,vtable中保存着虚函数的地址。
#include <stdio.h>
#include <iostream>
#include <cstring>
using namespace std;
using func = void (*)();
class base
{
public:
virtual void func1(){cout << "base::func1" <<endl;}
virtual void func2(){cout << "base::func2" <<endl;}
virtual void func3(){cout << "base::func3" <<endl;}
};
int main()
{
base b1;
printf("virtual table addr: %lX\n",*(unsigned long*)&b1);
((*(func*)(*(unsigned long*)&b1 + 0)))();
((*(func*)((unsigned long*)(*(unsigned long*)&b1) + 1)))();
return 0;
}