您的位置:首页 > 其它

虚函数表 & 指针

2009-04-30 13:37 120 查看
    今天看了hairetz转载的一篇关于虚函数表的文章,的确很好

    http://blog.csdn.net/hairetz/archive/2009/04/29/4137000.aspx

    然后对其中的一些问题又重新复习了下,通过下面的代码来解释

#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;
}

};

typedef void(*Fun)(void);

int main()
{
Base b;
Fun pFun = NULL;

cout<<(int*)*(int*)(&b)<<endl<<endl;     //虚函数表的首地址

//注意:虚函数表访问的时候,自己本身有个地址,然后他存储的也是地址(指向函数的地址)

cout<<endl;
cout<<(Fun)*((int*)*(int*)(&b)+0)<<endl;  //虚函数表里存储的函数的地址

cout<<(Fun)*((int*)*(int*)(&b)+1)<<endl;

cout<<(Fun)*((int*)*(int*)(&b)+2)<<endl;

cout<<endl;
cout<<(int *)*((int*)*(int*)(&b)+0)<<endl;

cout<<(int *)*((int*)*(int*)(&b)+1)<<endl;

cout<<(int *)*((int*)*(int*)(&b)+2)<<endl;

cout <<endl;
cout <<(Fun)((int*)*(int*)(&b)+0) <<endl; // 虚函数表里自己本身的地址

cout <<(Fun)((int*)*(int*)(&b)+1) <<endl;

cout <<(Fun)((int*)*(int*)(&b)+2) <<endl;

cout <<endl;
cout <<(int *)((int*)*(int*)(&b)+0) <<endl;

cout <<(int *)((int*)*(int*)(&b)+1) <<endl;

cout <<(int *)((int*)*(int*)(&b)+2) <<endl;

return 0;
}

/*

0046F01C   //虚函数表的首地址

0040122B   //虚函数表里存储的函数的地址
004010AF
004012AD

0040122B
004010AF
004012AD

0046F01C   //虚函数表里自己本身的地址
0046F020
0046F024

0046F01C
0046F020
0046F024
Press any key to continue

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fun 存储 c