2

この記事を検索しました: 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]

有線だと思います。

  1. メンバー関数を取得するための「きれいな方法」はありますか (静的メンバー関数のアドレスではありませんか?)。次の方法以外に、他にエレガントな方法はありますか?

    typedef void (Base::*Foo)();
    Foo f = &Base::foo();
    
  2. &Base::foo正しい C++ メンバ アドレスを取得できないのはなぜですか?

4

3 に答える 3

5
于 2013-02-16T13:15:27.130 に答える
0

&Base ::fooが正しいC++メンバーアドレスを取得しないのはなぜですか?

Base::fooは静的メソッドではありません。Baseに属するfooはありません。[foo 0x1]は何を意味するのだろうか(例:全体があまり意味をなさないのに、なぜ0x1なのか)?

于 2013-02-16T15:44:56.153 に答える