C++關於undefined reference to vtable for "" 的錯誤

C++關於vtable的錯誤


vtable的意思是虛函數表。

原文轉自:https://wsong83.wordpress.com/2012/03/27/c關於vtable的奇怪錯誤/

今天遇到了一個關於C++ vtable的奇怪錯誤,乍一看還真的很難理解,值得記錄一下。
假設下面的程序:

class Father {

public:

  virtual void function() const = 0;

};

class Child : public Father {

public:

Child(unsigned int data)

   : data(data) {}

  void function() const;

  //data

private:

  int data;

};

int main() {

  Child m_child(3);

  return 0;

}

看起來這段程序沒有任何問題。儘管Child類中的function()沒有定義,但是在main()中並不會用到Child::function(),所以一般情況下編譯和連接都沒有問題。

但是實際情況是:編譯會通過,連接時會報出類似如下的錯誤:

undefined reference to `vtable for Child

感覺上有函數沒有定義,可是找不到任何需要定義的函數。這裏的錯誤很可能報在構造函數的位置,使得錯誤信息更難理解了。信息中的vtable是唯一有用的信息,提示錯誤和虛函數有關。

爲了能正確連接,這段程序中我們必須定義一個function()的函數體。由於function是Father中純虛函數的一個重載,Child類則默認存在一個虛函數表以存儲重載虛函數。但由於function()沒有函數定義,編譯生成的目標代碼沒有生成任何有效的虛函數表,因而導致連接時出現找不到vtable的錯誤。如果function()是一個普通函數則不會出現如上問題。

感覺上,如果一個子類重載了任何虛函數,需要提供至少一個虛函數的實現,否則就會出現如上很難理解的錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章