2011-07-24 45 views
2

我使用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中的定義?

回答

2

由於func_in_ABC是一個虛擬函數,您實際上並不需要該符號名稱來調用它。你只需要在虛擬表中爲該特定虛擬功能設置偏移量。

如果您使func_in_ABC非虛擬,您應該看到在nm輸出中顯示的符號。

+0

我怎樣才能得到該功能的虛擬表的偏移量?如何將偏移映射到ABC或ABCImpl中的func_in_ABC? – Jimmy

+0

@Jimmy:你不需要。編譯器爲你處理。閱讀[虛擬和非虛擬成員函數的調用方式之間的差異]可能是值得的(http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq -20.3)。 –

+0

謝謝。我知道編譯器會處理它。但我想知道任何方法來獲得偏移量,讓我知道v-table的指針映射func_in_ABC,就像編譯器一樣。或者我可以得到指針/偏移量信息的任何命令?我不需要編譯器,但我想知道編譯對象的依賴/鏈接信息。 – Jimmy

相關問題