函数指针的疑惑
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