虚函数: 是为了实现面向对象的多态机制。 简单点来说,就是让父类指针指向子类对象实例,父类指针可以调用子类的成员函数,从而让父类指针有多种特性。
虚函数表:每个有虚函数的类都会有一张虚函数表,虚函数表其实就是类虚函数的地址表。编译器中规定指向虚函数表的指针位于对象实例的最前面位置。
<1>虚函数表地址获取:
class Base{
public:
virtual void f();
virtual void p();
private:
int data;
};
Base base;
cout<<"虚函数表地址:"<<(int*)(&base)<<endl;
<2>第一个虚函数地址获取:
cout<<"第一个虚函数地址:"<<(int*)*(int*)(&base)<<endl;
虚函数访问: 基类指针首先确定指向的派生类的对象实例,得到派生类虚函数表地址,然后确定虚函数的位序,得到虚函数在虚函数表的地址,这时候就可以访问虚函数。