返回信息流#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的地址?谁帮忙解释一下,:)
这是一条镜像帖。来源:北邮人论坛 / cpp / #48392同步于 2010/12/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
如何获得类实例的某个虚函数的实际地址?
wo
2010/12/27镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
void (Stock::*a)() = &Stock::Func;
void (Stock2::*b)() = &Stock2::Func;
这两行代码,我觉得 得到的应该是静态存储区中的这两个函数实现的地址,按理说不应该相等的~但是结果取得的地址a==b,好奇怪
随便说个思路,不知可行不,
你的代码中记往实例的地址,然后记住虚函数的地址,算偏移值,就出来了。
比如实例用new出来,然后记住这个实例的func地址,然后算偏移。
以后new出的实例,加个偏移就是func地址。
乱猜的,不过不知你要这个地址做什么用。
: 比如实例用new出来,然后记住这个实例的func地址,然后算偏移。
如何记住这个实例的func地址?我就是想问的这个
【 在 kissme 的大作中提到: 】
: 随便说个思路,不知可行不,
: 你的代码中记往实例的地址,然后记住虚函数的地址,算偏移值,就出来了。
: 比如实例用new出来,然后记住这个实例的func地址,然后算偏移。
: ...................