我使用shared_ptr作爲抽象類ABC。 ABCImpl類是ABC的實施。 abc_ptr是一個shared_ptr < ABC>指向一個ABCImpl對象。在調用者函數中,abc_ptr將調用ABC類中的一個成員函數(func_in_ABC)。編譯成功。但是當我使用nm或objdump時,我只能看到abc_ptr的符號。調用者函數中沒有爲func_in_ABC()顯示符號。如何在使用shared_ptr抽象類時在nm或objdump中查找函數符號?
任何人都知道爲什麼,或者我如何獲得調用函數中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);
}
從處的輸出爲D.o:
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編譯將失敗。我認爲編譯D.o時會檢查ABC類的定義。但爲什麼我找不到調用者的符號映射到ABC中的定義?
我怎樣才能得到該功能的虛擬表的偏移量?如何將偏移映射到ABC或ABCImpl中的func_in_ABC? – Jimmy
@Jimmy:你不需要。編譯器爲你處理。閱讀[虛擬和非虛擬成員函數的調用方式之間的差異]可能是值得的(http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq -20.3)。 –
謝謝。我知道編譯器會處理它。但我想知道任何方法來獲得偏移量,讓我知道v-table的指針映射func_in_ABC,就像編譯器一樣。或者我可以得到指針/偏移量信息的任何命令?我不需要編譯器,但我想知道編譯對象的依賴/鏈接信息。 – Jimmy