关于pFun = (Fun)*((int*)*(int*)(&b)); 这行代码左方第一个解引符号是什么意思
关于pFun = (Fun)*((int*)*(int*)(&b)); 这行代码左边第一个解引符号是什么意思?
typedef void(*Fun)(void);
Base b;
Fun pFun = NULL;
cout << "虚函数表地址:" << (int*)(&b) << endl;
cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl;
// Invoke the first virtual function
pFun = (Fun)*((int*)*(int*)(&b));
pFun();
上面是代码,我们知道如果(int*)*(int*)(&b)表示虚函数表中第一个函数地址,强制转换成void(*Fun)(void)指针,直接(Fun)((int*)*(int*)(&b))不就行了么,为什么要加“*”呢,如果左边第一个“*”是对(int*)*(int*)(&b)进行解引操作,完全就无法理解了,好像与代码意图不符。
------解决方案--------------------
(int*)*(int*)(&b) 这里面是存贮了一个地址。
*地址 就是到了取该地址的值
------解决方案--------------------
觉得(int*)(&b)是虚函数表指针的地址
(int*)*(int*)(&b)等于虚表指针的值,也就是虚函数表的地址(虚函数表应该相当于一个指针数组)
*((int*)*(int*)(&b))这个才是第一个虚函数的地址
------解决方案--------------------
你的代码中,pFun是个函数指针,它的值等于第一个虚函数的地址,所以pFun()相当于调用第一个虚函数
typedef void(*Fun)(void);
Base b;
Fun pFun = NULL;
cout << "虚函数表地址:" << (int*)(&b) << endl;
cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl;
// Invoke the first virtual function
pFun = (Fun)*((int*)*(int*)(&b));
pFun();
上面是代码,我们知道如果(int*)*(int*)(&b)表示虚函数表中第一个函数地址,强制转换成void(*Fun)(void)指针,直接(Fun)((int*)*(int*)(&b))不就行了么,为什么要加“*”呢,如果左边第一个“*”是对(int*)*(int*)(&b)进行解引操作,完全就无法理解了,好像与代码意图不符。
------解决方案--------------------
(int*)*(int*)(&b) 这里面是存贮了一个地址。
*地址 就是到了取该地址的值
------解决方案--------------------
觉得(int*)(&b)是虚函数表指针的地址
(int*)*(int*)(&b)等于虚表指针的值,也就是虚函数表的地址(虚函数表应该相当于一个指针数组)
*((int*)*(int*)(&b))这个才是第一个虚函数的地址
------解决方案--------------------
你的代码中,pFun是个函数指针,它的值等于第一个虚函数的地址,所以pFun()相当于调用第一个虚函数