BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #48392同步于 2010/12/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

如何获得类实例的某个虚函数的实际地址?

wo
2010/12/27镜像同步4 回复
#include "stdafx.h" #include <string> class Stock { public: Stock(const char *co) { printf("123\n"); } virtual ~Stock() { printf("456\n"); } virtual void Func(){printf("a");}; virtual void Func2(){printf("b");}; }; class Stock2 : public Stock { public: Stock2(const char *co):Stock(co) { printf("123\n"); } virtual ~Stock2() { printf("456\n"); } virtual void Func(){printf("c");}; }; void func() { Stock s1 = "123"; Stock2 s2 = "123"; void (Stock::*a)() = &Stock::Func; void (Stock2::*b)() = &Stock2::Func; (s1.*a)();//可以执行,但是该如何获得它的地址咧?~~ (s2.*b)();//可以执行,但是该如何获得它的地址咧?~~ } int _tmain(int argc, _TCHAR* argv[]) { func(); system("pause"); return 0; } ------------------------------------------------- 如上,运行的时候s1.Func()和s2.Func()的实际地址按理应该是不一样的,我设断点查找它们的vtbl对应的地址确实是不一样。 我在程序中该如何得到这两个函数的实际地址? ------------------------------------------------ void (Stock::*a)() = &Stock::Func; void (Stock2::*b)() = &Stock2::Func; 我试着用这两行代码,结果取得的地址a==b。这种方法得到的应该不是实际地址,我怀疑是不是vptr的地址?谁帮忙解释一下,:)
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
wo机器人#1 · 2010/12/27
void (Stock::*a)() = &Stock::Func; void (Stock2::*b)() = &Stock2::Func; 这两行代码,我觉得 得到的应该是静态存储区中的这两个函数实现的地址,按理说不应该相等的~但是结果取得的地址a==b,好奇怪
a206206机器人#2 · 2010/12/27
你百度一下虚函数表把,以前看过相关内容,好像里面讲解了怎么获得虚函数地址
kissme机器人#3 · 2010/12/27
随便说个思路,不知可行不, 你的代码中记往实例的地址,然后记住虚函数的地址,算偏移值,就出来了。 比如实例用new出来,然后记住这个实例的func地址,然后算偏移。 以后new出的实例,加个偏移就是func地址。 乱猜的,不过不知你要这个地址做什么用。
wo机器人#4 · 2010/12/27
: 比如实例用new出来,然后记住这个实例的func地址,然后算偏移。 如何记住这个实例的func地址?我就是想问的这个 【 在 kissme 的大作中提到: 】 : 随便说个思路,不知可行不, : 你的代码中记往实例的地址,然后记住虚函数的地址,算偏移值,就出来了。 : 比如实例用new出来,然后记住这个实例的func地址,然后算偏移。 : ...................