C++ 純虛析構函數 error LNK2019

C#和Java寫的多了,在能聲明爲接口的情況下,儘量不會聲明爲抽象類

昨天寫C++程序,理所當然的把基類裏的所有方法都寫成了純虛函數。事實上也的確應該全是純虛函數。因爲我是把兩個(以後可能會是n個)硬件廠商的SDK抽象出來,硬件不一樣,軟件SDK差別就更大了,完全沒有一致的地方。

基類的析構函數應該聲明爲虛函數的,索性一不做二不休聲明爲純虛構函數好了。

這樣,一個類似與Java中接口的C++抽象類就產生了,它只有頭文件,源文件裏只有兩個#include,還是VS自動生成的。

等到我把實現寫好,編譯鏈接時報錯:錯誤 1 error LNK2019: 無法解析的外部符號 "public: virtual __thiscall ::~CMyBaseClass(void)" ,該符號在函數 ******** 中被引用 

查了一下,析構函數必須要有函數體,哪怕你把他聲明爲純虛函數。

析構函數,構造函數這些還是和普通的函數是不一樣的。對照構造函數,派生類的構造函數必須先調用基類的構造函數。也許你沒調用過,那是因爲默認情況下調用無參數的默認構造函數。類似的,析構函數也是一樣,他必然會調用基類的析構函數,不同的是,他是後調用基類析構函數的。所以基類的析構函數必須要有函數體。

給基類純虛析構函數加了一個空的函數體,編譯鏈接通過,在派生類析構函數開始除設置斷點,單步跟蹤,在執行完派生類析構函數後,跳到基類析構函數繼續執行。

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