【发布时间】:2013-02-01 08:49:09
【问题描述】:
我搜索了这篇文章: C++ : Getting function virtual 'address' with member function pointer
为了测试虚拟成员函数是否通常在对象的起始地址,我写了如下代码:
#include <pwd.h>
#include <string.h>
#include <stdio.h>
class Base
{
public:
int mBase1;
char mBase2;
virtual void foo()
{
fprintf(stderr,"Base foo called\n");
}
};
class Child: public Base
{
public:
int cc;
virtual void foo()
{
fprintf(stderr,"Child foo called");
}
};
int main(int argc, char *argv[])
{
Base bb;
fprintf(stderr,"[mBase1 %p][mBase2 %p] [foo %p]\n",&bb.mBase1,&bb.mBase2,&Base::foo);
return 0;
}
编译时出现警告:
test.cpp:30:88: warning ‘%p’ expects argument of type ‘void*’, but argument 5 has type ‘void (Base::*)()’ [-Wformat]
输出是:
[mBase1 0xbfc2ca38][mBase2 0xbfc2ca3c] [foo 0x1]
我认为它是有线的。
-
是否有任何“漂亮的方法”来获取成员函数(不是静态成员函数地址?)。除了下面的方法,还有其他优雅的方法吗?
typedef void (Base::*Foo)(); Foo f = &Base::foo(); 为什么
&Base::foo没有得到正确的C++成员地址?
【问题讨论】:
-
函数本身不会在对象的开头;指向 v 表的指针(通常)将位于对象的开头,并且在指向的表中,您会找到指向函数的指针(但不是函数本身)。
-
“普通”指针,包括函数指针,通常表示为机器地址;成员指针不是。考虑
Derived d; (d.*f)();工作,但调用Derived::Foo正如人们所期望的那样。如果f是一个特定地址,你就不能这样做。