首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

函数指针的纳闷

2013-08-01 
函数指针的疑惑class Base {public:virtual void f() { cout Base::f endl }virtual void g() {

函数指针的疑惑
class Base {
     public:
            virtual void f() { cout << "Base::f" << endl; }
            virtual void g() { cout << "Base::g" << endl; }
            virtual void h() { cout << "Base::h" << endl; }
 
};

int main()

{
    typedef void(*Fun)(void);
 
            Base b;
 
            Fun pFun = NULL;
Fun pFun1 = NULL;
 
            cout << "虚函数表地址:" << (int*)(&b) << endl;  
            cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl; 
    cout<<"解引用第一个函数地址:"<<*((int*)*(int*)(&b))<<endl;//获取虚函数表的第一个函数地址的内容
            // Invoke the first virtual function 
            pFun = (Fun)*((int*)*(int*)(&b));//ok:此处我想知道为什么是对啊
    pFun1 = (Fun)((int*)*(int*)(&b));//error:
            pFun();
    pFun1();
 
}
  pFun = (Fun)*((int*)*(int*)(&b));//ok:此处我想知道为什么是对的
((int*)*(int*)(&b))是虚函数第一个函数的地址,pFun是函数指针,函数指针应该指向地址才对啊,为什么要解引用呢?解引用之后就成了地址里面的内容了


函数指针 指针 函数
[解决办法]
(int*)(&b)=>把类的地址转换成(int*),这个地址指向vtable,*(int*)(&b)取出来的就是虚表的地址
在把里面的内容转成 (int*) 这样 *((int*)*(int*)(&b)) 就是取的虚表第一项的内容了,这个内容就是void f的地址,然后转成PFUN指针。over

热点排行