虚函数对C++内存模型的影响
#include <iostream> using namespace std; class B { public: virtual void f() { cout<<"B::f"<<endl; } virtual void g() { cout<<"B::g"<<endl; } virtual void h() { cout<<"B::h"<<endl; } ~B() { } }; typedef void (*Fun)(void); //此测试编译环境为32bit,如果64bit可能会出错 int main(void) { B b; Fun f = NULL; cout<<"对象地址:"<<&b<<endl; cout<<"虚表地址:"<<(int *)*(int *)&b<<endl; cout<<"虚表中第一个虚函数地址:"<<(int *)*(int *)*(int *)&b<<endl; cout<<"虚表中第二个虚函数地址:"<<(int *)*((int*)*(int*)(&b)+1)<<endl; cout<<"虚表中第三个虚函数地址:"<<(int *)*((int *)*(int *)&b+2)<<endl; //----------------------------------------- int **q = (int **)&b; int **p = (int **)q[0]; cout<<"对象地址:"<<q<<endl; cout<<"虚表地址:"<<p<<endl; cout<<"虚表中第一个虚函数地址:"<<p[0]<<endl; cout<<"虚表中第二个虚函数地址:"<<p[1]<<endl; cout<<"虚表中第三个虚函数地址:"<<p[2]<<endl; //----------------------------------------- f = (Fun)p[0]; f(); f = (Fun)p[1]; f(); f = (Fun)p[2]; f(); //----------------------------------------- int **p1 = (int **)&b; f = (Fun)p1[0][0]; f(); f = (Fun)p1[0][1]; f(); f = (Fun)p1[0][2]; f(); //----------------------------------------- f = (Fun)*((int*)*(int*)(&b)); f(); f = (Fun)*((int*)*(int*)(&b)+1); f(); f = (Fun)*(((int*)*(int*)(&b))+2);; f(); return 0; }
运行结果:
-----------------------我和我追猪的梦-----------------------------------------------------------------
作者:mickole


浙公网安备 33010602011771号