title: Undefined reference to vtable
body: <p>When building my C++ program, I'm getting the error message </p>
  
  <blockquote>
    <p>undefined reference to 'vtable...</p>
  </blockquote>
  
  <p>What is the cause of this problem? How do I fix it?</p>
  
  <hr>
  
  <p>It so happens that I'm getting the error for the following code (The class in question is CGameModule.) and I cannot for the life of me understand what the problem is. At first, I thought it was related to forgetting to give a virtual function a body, but as far as I understand, everything is all here. The inheritance chain is a little long, but here is the related source code. I'm not sure what other information I should provide.</p>
  
  <p>Note: The constructor is where this error is happening, it'd seem.</p>
  
  <p>My code:</p>
  
  <pre><code>class CGameModule : public CDasherModule {
   public:
    CGameModule(Dasher::CEventHandler *pEventHandler, CSettingsStore *pSettingsStore, CDasherInterfaceBase *pInterface, ModuleID_t iID, const char *szName)
    : CDasherModule(pEventHandler, pSettingsStore, iID, 0, szName)
    { 
        g_pLogger-&gt;Log("Inside game module constructor");   
        m_pInterface = pInterface; 
    }
  
    virtual ~CGameModule() {};
  
    std::string GetTypedTarget();
  
    std::string GetUntypedTarget();
  
    bool DecorateView(CDasherView *pView) {
        //g_pLogger-&gt;Log("Decorating the view");
        return false;
    }
  
    void SetDasherModel(CDasherModel *pModel) { m_pModel = pModel; }
  
  
    virtual void HandleEvent(Dasher::CEvent *pEvent); 
  
   private:
  
  
  
    CDasherNode *pLastTypedNode;
  
  
    CDasherNode *pNextTargetNode;
  
  
    std::string m_sTargetString;
  
  
    size_t m_stCurrentStringPos;
  
  
    CDasherModel *m_pModel;
  
  
    CDasherInterfaceBase *m_pInterface;
  };
  </code></pre>
  
  <p>Inherits from...</p>
  
  <pre><code>class CDasherModule;
  typedef std::vector&lt;CDasherModule*&gt;::size_type ModuleID_t;
  
  /// \ingroup Core
  /// @{
  class CDasherModule : public Dasher::CDasherComponent {
   public:
    CDasherModule(Dasher::CEventHandler * pEventHandler, CSettingsStore * pSettingsStore, ModuleID_t iID, int iType, const char *szName);
  
    virtual ModuleID_t GetID();
    virtual void SetID(ModuleID_t);
    virtual int GetType();
    virtual const char *GetName();
  
    virtual bool GetSettings(SModuleSettings **pSettings, int *iCount) {
      return false;
    };
  
   private:
    ModuleID_t m_iID;
    int m_iType;
    const char *m_szName;
  };
  </code></pre>
  
  <p>Which inherits from....</p>
  
  <pre><code>namespace Dasher {
    class CEvent;
    class CEventHandler;
    class CDasherComponent;
  };
  
  /// \ingroup Core
  /// @{
  class Dasher::CDasherComponent {
   public:
    CDasherComponent(Dasher::CEventHandler* pEventHandler, CSettingsStore* pSettingsStore);
    virtual ~CDasherComponent();
  
    void InsertEvent(Dasher::CEvent * pEvent);
    virtual void HandleEvent(Dasher::CEvent * pEvent) {};
  
    bool GetBoolParameter(int iParameter) const;
    void SetBoolParameter(int iParameter, bool bValue) const;
  
    long GetLongParameter(int iParameter) const;
    void SetLongParameter(int iParameter, long lValue) const;
  
    std::string GetStringParameter(int iParameter) const;
    void        SetStringParameter(int iParameter, const std::string &amp; sValue) const;
  
    ParameterType   GetParameterType(int iParameter) const;
    std::string     GetParameterName(int iParameter) const;
  
   protected:
    Dasher::CEventHandler *m_pEventHandler;
    CSettingsStore *m_pSettingsStore;
  };
  /// @}
  
  
  #endif
  </code></pre>