我搜索了这篇文章: 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++ 成员地址?