1.首先每一个由虚函数的类都有一张虚函数表。(实例对象必须有虚函数)
2.虚函数表存在于类的每个对象,并不在类中
3.虚函数按照声明的顺序存放在虚函数表中。
4.虚函数表本质上是一块连续的内存
5.虚函数表存放在该对象内存的开头,内存开头的位置就是虚函数表的位置
6.32位系统的虚函数地址由4个字节构成,同理64位系统由8个字节构成
首先构建一个虚函数类
class Test
{
public:
int x;
virtual void f(){ cout << "a" << endl; };
virtual void f1(){ cout << "b" << endl; };
};
声明Test类的对象并获取该对象的地址
Test a;
cout << "address : " << &a << endl;
通过int(四字节)来获取虚函数表地址
cout <<“虚函数表地址:"<<*(int*)&a
cout <<“f()虚函数地址:"<<*(int*)*(int*)&a
cout <<“f1()虚函数地址:"<<*((int *)*(int *)(&a) + 1));
通过虚函数表地址调用虚函数
typedef void(*fun)(void); //声明一个函数指针fun,
(fun)*((int *)*(int *)(&a));//执行函数f()
(fun)*((int *)*(int *)(&a)+1);//执行函数f1()