我想要获得一个具体对象的成员函数的地址,什么办法?

baifanmvp 2008-11-16 11:22:08
如果有个A类,成员函数为f(),那么成员函数的地址就是&A::f,哪么这个地址到底是谁的? 如果我要用A类去定义一个对象a的话,哪么a中的f()的地址怎么获得?
有什么办法?
或者说我以上说的那些都错误的,我本来就理解错了? 对象的成员函数能获得么?
...全文
223 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
太乙 2008-11-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yihan7h 的回复:]
汗。。1楼正解,看了那链接就明白了
[/Quote]

upup~~~~~~~~~


yihan7h 2008-11-17
  • 打赏
  • 举报
回复
汗。。1楼正解,看了那链接就明白了
liumingrong 2008-11-17
  • 打赏
  • 举报
回复

注意是类的成员函数,对于一般成员函数,所以类的对象都共用它
普通的成员函数(非虚,非静态)实际上跟一般函数没有什么区别
比如你有
class A
{
public:
void print()
{
}
};
编译器会将print转换成一个普通函数,类似于 void A_print(A * const this);
它增加了一个this参数,指向类对象,
所以
A a;
a.print();会被编译器转换成 A_print(&a);就像调用普通函数一样,这个&a就将赋值编译器安插的this指针(当然一些复杂情况比如继承会有偏移量计算)
这些都是编译器做的事,你不要那样做,即便你获得了成员函数指针,也要像调用成员函数那样调用它,
其他方法都不可靠,即使在某些情况下你正好碰巧获得正确结果

[Quote=引用楼主 baifanmvp 的帖子:]
如果有个A类,成员函数为f(),那么成员函数的地址就是&A::f,哪么这个地址到底是谁的? 如果我要用A类去定义一个对象a的话,哪么a中的f()的地址怎么获得?
有什么办法?
或者说我以上说的那些都错误的,我本来就理解错了? 对象的成员函数能获得么?
[/Quote]
MAlice 2008-11-17
  • 打赏
  • 举报
回复
up
就呆在云上 2008-11-17
  • 打赏
  • 举报
回复
对象的成员函数和类的成员函数你为什么要研究哦
有一个类你用就是了撒
要用的话就这样把,不管是共有的还是私有的。
#include <iostream>
using namespace std;
void print() {
cout << "asdf\n";
}
class tt;
typedef int (tt::*MM)() ;
class tt{
public:
void (*p) ();
tt() {
p = &(::print);
}
int a() {
cout << "public a function!\n";
return 1;
}
MM get_x() {
return &tt::x;
}
private:
int x() { cout << "private a function!\n";
return 1;
}
};

int main() {
cout << sizeof(tt) << endl; //4 not 1, void *p in class tt is a val, not a function! so sizeof is 4
tt a;
a.p();
cout << &tt::a << endl;

MM myf = &tt::a; //获取共有成员函数
(a.*myf)(); //like this
MM myf1 = a.get_x();
(a.*myf1)();
}

taodm 2008-11-17
  • 打赏
  • 举报
回复
C++没有提供获得成员函数地址的机制,不要在这条死路上多耗时间了。
另外,你需要一本好点的C++教材,重新学一下“指向成员的指针”
yihan7h 2008-11-16
  • 打赏
  • 举报
回复
楼上正解。
malone1 2008-11-16
  • 打赏
  • 举报
回复
函数是所有对象共有的,实例也是调用这个类的函数;
toadzw 2008-11-16
  • 打赏
  • 举报
回复
在类的定义时,其分配这些函数的空间;对象只是根据类的调用时去查找类定义时的函数地址;
toadzw 2008-11-16
  • 打赏
  • 举报
回复
函数是所有对象共有的,实例也是调用这个类的函数;
太乙 2008-11-16
  • 打赏
  • 举报
回复
  
// 计算函数真实地址
unsigned char* funaddr= (unsigned char*)f;//void f(){}
if(funaddr[0]==0xE9)// 判断是否为虚拟函数地址,E9为jmp指令
{
unsigned long realaddr=(unsigned long)f;
realaddr += funaddr[2]*0x100 +funaddr[1] +5;
printf( "函数实际地址:0x%0X\n", realaddr);
}

太乙 2008-11-16
  • 打赏
  • 举报
回复
http://www.cnblogs.com/yfcomeon/archive/2007/10/17/926996.html

很清楚!!!!

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧