Re: [問題] 關於Class指標的觀念
看板C_and_CPP (C/C++)作者descent (「雄辯是銀,沉默是金」)時間11年前 (2013/08/28 10:26)推噓4(4推 0噓 14→)留言18則, 4人參與討論串8/19 (看更多)
: http://www.parashift.com/c++-faq-lite/cant-cvt-memfnptr-to-voidptr.html
: 看來無法將 void* 轉 member function pointer。
: 我用得方法其實是把 member function 當成 non member function,
: 再把 this 傳進去。
: 大概像是這樣。
這是 virtual member function 的版本, 基本原理是一樣。
env:
g++-4.6.real (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Ubuntu/Linaro x86 32bit
virtual member function:
void (A::*p)() = &A::func;
804873f: c7 44 24 14 01 00 00 movl $0x1,0x14(%esp)
8048746: 00
8048747: c7 44 24 18 00 00 00 movl $0x0,0x18(%esp)
804874e: 0
不過我沒搞懂這兩部份是用來幹嘛的?
得請 cppgm 參加人員解惑了。
c 語言應該沒有這麼奇怪的東西吧?
#include <iostream>
#include <cstdio>
using namespace std;
struct A
{
virtual void func()
{
printf("i: %d\n", i_);
}
void inc()
{
++i_;
}
A()
{
i_=10;
}
private:
int i_;
};
int main()
{
void (A::*p)() = &A::func;
A a;
(a.*p)();
unsigned int vptr_addr = *(unsigned int *)&a;
cout << "vptr_addr:" << hex << vptr_addr << endl;
unsigned int func_addr = *(unsigned int *)vptr_addr;
cout << "func_addr:" << hex << func_addr << endl;
a.inc();
(*(void(*)(A*))(func_addr) )(&a);
A aa;
(*(void(*)(A*))(func_addr) )(&aa);
(*(void(*)(A*))(func_addr) )(&a);
(*(void(*)(A*))(func_addr) )(&aa);
return 0;
}
執行結果:
i: 10
vptr_addr:8048af8
func_addr:80489b4
i: 11
i: 10
i: 11
i: 10
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.125.239.51
→
08/28 10:37, , 1F
08/28 10:37, 1F
推
08/28 11:15, , 2F
08/28 11:15, 2F
→
08/28 12:04, , 3F
08/28 12:04, 3F
→
08/28 12:07, , 4F
08/28 12:07, 4F
→
08/28 12:08, , 5F
08/28 12:08, 5F
→
08/28 12:08, , 6F
08/28 12:08, 6F
→
08/28 12:20, , 7F
08/28 12:20, 7F
→
08/28 12:21, , 8F
08/28 12:21, 8F
推
08/28 12:24, , 9F
08/28 12:24, 9F
→
08/28 12:24, , 10F
08/28 12:24, 10F
可以加上 c call convention 試試看嗎?
也許預設使用了 fastcall convention。
※ 編輯: descent 來自: 59.125.239.46 (08/28 12:34)
推
08/28 12:36, , 11F
08/28 12:36, 11F
→
08/28 12:37, , 12F
08/28 12:37, 12F
→
08/28 12:44, , 13F
08/28 12:44, 13F
→
08/28 13:07, , 14F
08/28 13:07, 14F
→
08/28 13:12, , 15F
08/28 13:12, 15F
推
08/28 13:16, , 16F
08/28 13:16, 16F
→
08/28 13:17, , 17F
08/28 13:17, 17F
→
08/28 21:08, , 18F
08/28 21:08, 18F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章