[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
報錯的直接緣由則是:找不到Derive類構造、析構函數的定義。由於沒有定義、只有申明的函數是沒法使用的。code
簡單起見,咱們Derive構造析構函數加上花括號(空函數體) Derive(){};
orm
接着運行出現:htm
如今找不到Base構造、析構函數的實現,還找不到虛函數表: undefined reference to vtable for Derive
blog
找不到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()即時沒有定義,在編譯過程當中也不會報錯。固然你要強行調用這個沒定義的函數也會一樣報錯。
最後總結一下:
最終版的代碼:
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(){}; };