この記事を検索しました: 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++ メンバ アドレスを取得できないのはなぜですか?