虚函数对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;
}

运行结果:

image

posted @ 2014-04-07 15:26  mickole  阅读(142)  评论(0)    收藏  举报