這篇文章給大家介紹成員函數(shù)指針的結(jié)構(gòu)以及怎么與普通函數(shù)指針之間的轉(zhuǎn)換,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
通過內(nèi)存拷貝(memcpy等)可以實現(xiàn)任意指針
間的強制轉(zhuǎn)換,但不能保證可以正常使用。
通過網(wǎng)上查找發(fā)現(xiàn):
函數(shù)成員指針其實與普通成員指針不同,它除了包含函數(shù)本身地址以外還包含其他信息(例如是否為虛函數(shù)等),所以不能簡單的理解成員函數(shù)指針就是普通指針那樣一般占4字節(jié),這個視編譯器不同而不同:例如在VS中,普通成員函數(shù)指針類似于
struct ptr{
int * addr;
};
而虛函數(shù)的結(jié)構(gòu)比較復(fù)雜,它是通過this指針加索引的方式來獲取函數(shù)的真實地址,目前沒有完全明白,此不贅述。
這里提獲取成員函數(shù)真實地址的方法:
1 .普通成員函數(shù)
通過觀察不難發(fā)現(xiàn)結(jié)構(gòu)體的首地址就是addr的首地址,所以成員函數(shù)的入口地址其實也就是函數(shù)指針的地址,但是C++出于類型安全的考慮不允許他們轉(zhuǎn)換成其他普通指針,如:
class test { public: void print(){} }; typedef void (test::*cfun)(); typedef void (*fun)(); cfun cf = &test::print; fun f= cf; //失敗,類型檢查 memcpy(&f,&cf,sizeof(fun)); f(); //成功
2. 虛函數(shù)
(1)通過虛函數(shù)表獲取
class test{ public: virtual void print(){} }; typedef void (test::*cfun)(); typedef void (*fun)(); test t; int **vptr = (int**)(&t); //vptr[0]獲取虛函數(shù)表地址 cfun f = vptr[0][0]; //后面那個零時虛函數(shù)在虛函數(shù)表中的索引,表示第一個虛函數(shù) f(); ((fun) vptr[0][0])();
通常不能用&test::print獲取虛函數(shù)地址,即使獲取地址也是一個中間值或者總是返回0x1。
3. 通用的指針轉(zhuǎn)換函數(shù)
template<class T,class R> R convert(T t) { long addr = 0; memcpy(&addr,&t,sizeof(long)); return (R)(addr); }
但不能保證轉(zhuǎn)換的有效性。
關(guān)于成員函數(shù)指針的結(jié)構(gòu)以及怎么與普通函數(shù)指針之間的轉(zhuǎn)換就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
網(wǎng)站題目:成員函數(shù)指針的結(jié)構(gòu)以及怎么與普通函數(shù)指針之間的轉(zhuǎn)換-創(chuàng)新互聯(lián)
文章來源:http://chinadenli.net/article46/ddiihg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、品牌網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、網(wǎng)站營銷、手機網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容