虚函数和虚函数表 - 多态的实现原理
-
虚函数表
C++中虚函数是通过一张虚函数表(virtual table)来实现的,在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题
在有虚函数的类的实例中这个表被分配在了这个对象的内存中,所以当我们用父类的指针来操作一个子类的时候,这张虚函数表就像一张地图一样指明了实际所应该调用的函数#include<iostream> using namespace std; class Base { public: virtual void f() { cout << "Base::f()" << endl; } virtual void g() { cout << "Base::g()" << endl; } virtual void h() { cout << "Base::h()" << endl; } }; class Device:public Base { public: #if 0 virtual void f1() { cout << "Base::f1()" << endl; } #endif virtual void f() { cout << "Base::f1()" << endl; } virtual void g1() { cout << "Base::g1()" << endl; } virtual void h1() { cout << "Base::h1()" << endl; } }; typedef void (*Fun) (void); int main(int argc, const char *argv[]) { Device b; Fun pFun = NULL; cout << "虚函数表的位置:" << (int*)(&b) << endl; cout << "虚函数表的第一个函数地址为:"<<(int*)*(int*)(&b) << endl; pFun = (Fun)*((int*)*(int*)(&b)); pFun(); pFun = (Fun)*((int*)*(int*)(&b)+1); //对&b取两次地址,让函数指针后移的方式遍历虚函数表中的函数,并执行它们,根据打印结果判断是哪个函数执行 pFun(); pFun = (Fun)*((int*)*(int*)(&b)+2); pFun(); pFun = (Fun)*((int*)*(int*)(&b)+3); pFun(); return 0; }