虛函數與純虛函數--定義問題
部分轉自http://blog.csdn.net/qq_20949431/article/details/70740488
1. 虛函數的聲明和定義
具體關於虛函數的知識不做多講,我在定義一個抽象類時,忘了將一個虛函數聲明為 純虛函數,又沒有對其定義, 導致編譯報錯時報錯如下:
undefined reference to `vtable for Fibonacci‘
錯誤提示的很明顯,就是無法生成虛函數表。
我們知道,虛函數表(地址)在定義了虛函數的類所實例化的對象內存中的第一個位置,也就是在實例化過程中生成了虛表。這個錯誤提示在stackflow中最常見的解答就是類中聲明了虛函數,卻沒有定義。
總結一下虛函數聲明和定義的規則如下:
類中的virtual函數,要麽設為純虛函數,要麽有定義,否則無法生成虛函數表。
虛函數的可以類外定義,但是必須加上類名,類外定義不需要加virtual
聲明為純虛函數,則類為抽象類,無法實例化,進一步強調,想要實例化有虛函數的類,必須對虛函數進行定義
基類定義為虛函數,則子類同名函數也為虛函數,無論是否有virtual關鍵字修飾(一般聲明時加virtual,便於閱讀)
凡是基類定義有虛函數,則基類需要定義虛析構函數(根據上一條法則,虛析構函數要麽有定義,要麽純虛,一般不設為純虛,可以定義空白)
虛函數通過虛表實現,虛表是類實例化時生成在對象中的(虛表地址),所以如果一個類能夠實例化,則其虛函數必須有定義,如果不想定義虛函數,只能聲明為純虛函數,留給子類定義。
轉自 http://blog.csdn.net/happymawolf/article/details/6369585
2,純虛函數是可以被定義的。
今天,我讀到《effective c++》的第34條款,裏面竟然提到純虛函數也是可以定義的,大吃一驚,趕快打開vs2005,自己編寫了一段代碼,編譯運行,發現竟然真的可以!
俺的代碼:
[cpp] view plain copy
- class A
- {
- public:
- virtual void pureVirtualFunc() = 0;
- };
- void A::pureVirtualFunc()
- {
- cout<<"I‘am pureVirtualFunc"<<endl;
- }
- class B : public A
- {
- public:
- void pureVirtualFunc() { A::pureVirtualFunc(); cout<<"I belong to B!"; }
- };
- int main(void)
- {
- B b;
- b.pureVirtualFunc();
- return 0;
- }
運行結果:
I‘am pureVirtualFunc
I belong to B!請按任意鍵繼續. . .
原來抽象類是可以對純虛函數進行定義的,在其子類中也是可以使用抽象父類的缺省實現!這一切對我來說顯得這麽突然!好像腿腳一軟,站不穩了!是的,以前天天啃個不停個的教材竟然存在如此偏差!等等!好像教材裏也沒錯!裏面並沒有說“不能”進行函數實現,而是根本就沒有提到要去實現。所以老師和天真的我們都默認為不能實現咯!
在此我深深感悟到,目光短淺和學無止境的真正含義了!
虛函數與純虛函數--定義問題