2012-12-16 94 views
0

可能重複:
Undefined reference to vtable未定義參考與繼承V表

運行下面的代碼導致接頭錯誤

'undefined reference to vtable for ManagedObjects'

#include <cstdlib> 
#include <iostream> 
#include <list> 
#include <string> 
using namespace std; 

class ManagedObjects 
{ 
     public: 
     virtual string get() const; 
     virtual ~ManagedObjects(){}; 
}; 

class CallbackOwner1 : public ManagedObjects 
{ 
public: 
     string get() const {return "CallbackOwner1";} 
}; 

class CallbackFunctor 
{ 
public: 
    CallbackFunctor(const ManagedObjects* b):m_cbr(b) 
    {} 
    string operator()() 
    { 
     return m_cbr->get(); 
    } 

    const ManagedObjects* m_cbr; 
}; 

int main(int argc, char *argv[]) 
{ 
    ManagedObjects* cb1 = new CallbackOwner1(); 
    CallbackFunctor f(cb1); 
    cout << f() << endl; 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
+0

@RaymondChen確實是這樣,有許多問題與完全相同的問題。 –

回答

2

您沒有在任何地方定義virtual string ManagedObjects::get() const方法。將其定義爲純虛函數virtual string get() const = 0;或爲其提供聲明。

+0

啊,謝謝!我不知道我是如何錯過 – Kam

+0

請閱讀此處:http://gcc.gnu.org/faq.html#vtables - 只要聲明瞭第一個虛擬非內聯方法,就會生成vtable。如果你已經同時聲明瞭get()和methodX()(按照這個順序),並且定義了其他地方,爲get()定義了一個定義,但methodX沒有定義,那麼錯誤消息會更加安全。 –