C++中undifined reference to xxx問題

[1]中有這樣一份代碼html

#include <iostream>
using namespace std;
class Base
{
public:
    Base();
    void f1();//member function
    virtual void f2();//virtual function
    virtual void f3()=0;//pure virtual function
    virtual ~Base();//virtual destructor function
};
class Derive:public Base
{
public:
    Derive();
    void f1();
    void f2();
    void f3();
    virtual ~Derive();
};
int main () {
    Derive d;
    return 0;
}

運行時,出現以下錯誤:ios

undefined reference to Derive::Derive()
undefined reference to Derive::~Derive()函數

其實這份代碼中有2處錯誤spa

  1. 顯式構造函數須要加空函數體(null bodies)
  2. base類的虛函數也須要加函數體

報錯的直接緣由則是:找不到Derive類構造、析構函數的定義。由於沒有定義、只有申明的函數是沒法使用的。code

簡單起見,咱們Derive構造析構函數加上花括號(空函數體) Derive(){};orm

接着運行出現:htm

clipboard.png

如今找不到Base構造、析構函數的實現,還找不到虛函數表: undefined reference to vtable for Deriveblog

找不到vtable問題即是[2]中提到的繼承

more obscure messages from the Gnu C++ compiler - or rather from the loaderip

解決方法是給Base中虛函數f2()也加上函數體。而因爲Derive繼承以後的f2仍然是虛函數,因此Derive::f2()也須要加上花括號。

這是由於連接器linker須要將虛函數表vtable 放入某個object file,可是linker沒法找到正確的object文件[3]。因此虛函數要有定義

而成員函數f1()即時沒有定義,在編譯過程當中也不會報錯。固然你要強行調用這個沒定義的函數也會一樣報錯。

最後總結一下:

  1. 顯示申明構造函數、析構函數必定要有定義
  2. C++類繼承過程當中父類的普通成員函數能夠沒定義。可是虛函數必定要有定義

最終版的代碼:

class Base
{
public:
    Base(){};
    void f1();//member function
    virtual void f2(){};//virtual function
    virtual void f3()=0;//pure virtual function
    virtual ~Base(){};//virtual destructor function
};
class Derive:public Base
{
public:
    Derive(){};
    void f1();
    void f2(){};
    void f3(){};
    virtual ~Derive(){};
};

Reference

相關文章
相關標籤/搜索