2

抽象クラス ABC に shared_ptr を使用します。ABCImpl クラスは ABC の実装です。abc_ptr は、ABCImpl オブジェクトを指す shared_ptr< ABC> です。呼び出し元関数では、abc_ptr は ABC クラスのメンバー関数 (func_in_ABC) の 1 つを呼び出します。コンパイルは成功です。しかし、nm や objdump を使用すると、abc_ptr のシンボルしか表示されませんでした。呼び出し元関数の func_in_ABC() に対して表示されるシンボルはありません。

呼び出し元関数で func_in_ABC() のシンボルの出力を取得する理由、または方法を知っている人はいますか?

コードは次のとおりです。 ABC.h:

#include <boost/shared_ptr.hpp>

class ABC
{
    public:
        virtual void func_in_ABC(const int param) = 0;
};

typedef boost::shared_ptr<ABC> ABCPtr;
ABCPtr get_ABC_ptr();

ABCImpl.h で:

#include "ABC.h"

class ABCImpl : public 
{
    public:
        ABCImpl() {}
        void func_in_ABC(const int param);
    private:
        int data;
};

ABCImpl.cpp で:

#include "ABCImpl.h"

ABCPtr get_ABC_ptr()
{
        return ABCPtr(new ABCImpl());
}

void ABCImpl::func_in_ABC(const int param)
{
    data = param;
}

呼び出し元関数 D.cpp:

#include "D.h"
#include "ABC.h"

void D::call_ABC()
{
    ABCPtr abc_ptr = get_ABC_ptr();
    abc_ptr->func_in_ABC(100);
}

nm からの Do の出力:

         U _Unwind_Resume
         U get_ABC_ptr()
0000000000000000 T D::call_ABC()
0000000000000000 W boost::shared_ptr<ABC>::operator->() const
0000000000000000 r boost::shared_ptr<ABC>::operator->() const::__PRETTY_FUNCTION__
         U __assert_fail
         U __gxx_personality_v0

ABC.h の func_in_ABC の定義を変更すると、D.cpp のコンパイルが失敗します。Do をコンパイルするときに、クラス ABC の定義をチェックすると思います。

4

1 に答える 1

2

は仮想関数であるためfunc_in_ABC、実際に呼び出すためにシンボル名は必要ありません。その特定の仮想機能の仮想テーブルへのオフセットが必要なだけです。

非仮想にすると、シンボルが出力func_in_ABCに表示されるはずです。nm

于 2011-07-24T09:47:04.017 に答える