C++多态实现——虚函数表
C++虚函数
虚函数是用来实现C++的多态,是OOP【封装,继承,多态】思想中最终要的点. 一句话说父类定义虚函数,子类重写虚函数实现覆盖(Override),然后通过指向子类的父类指针,调用子类重写的虚函数,动态完成多态。
虚函数表
. 每个类都会创建一张虚函数表管理自己定义的虚函数,利用虚函数来实现多态。在C++标准说明书中说到,编译器必须需要保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证正确取到到虚函数的偏移量), 这意味着我们可以通过对象的实例的地址找到虚函数表,然后遍历其中的函数指针,并调用相应的函数。
代码块
#include<iostream>
using namespace std;
class Base {
public:
Base() {
}
virtual void f() {
cout<<"ffffff"<<endl;
}
virtual void g() {
cout<<"gggggg"<<endl;
}
virtual void h() {
cout<<"hhhhhh"<<endl;
}
};
class Stb : public Base {
public :
void f() {
cout<<"fsfsfsfs"<<endl;
}
};
int main () {
typedef void(*Fun)(void); //定义一个指针类型Fun 类型是void(*)(void);
Base *b=new Stb();
cout<<"父类指针的大小"<<sizeof(b)<<endl;
Fun pfun=NULL;
Fun bfun=NULL;
Fun dfun=NULL;
cout<<"虚函数表的地址:"<<(long *)(b)<<endl;
cout<<"虚函数表第一个函数的地址"<<(long *)*(long *)(b)<<endl;
//现在开始 通过虚函数表来调用函数试一试
pfun=(Fun)*((long *)*(long *)(b)+0);
pfun();
//验证第二个虚函数
bfun=(Fun)*((long *)*(long *)(b)+2);
cout<<"第二个虚函数的地址:(——指针偏移量为8字节呢.)"<<((long *)*(long *)(b)+2)<<endl;
bfun();
dfun=(Fun)*((long *)*(long *)(b)+4);
cout<<"第三个虚函数在虚函数表中的地址"<<((long *)*(long *)(b)+4)<<endl;
dfun();
return 0;
}