1. 程式人生 > >虛函數與純虛函數--定義問題

虛函數與純虛函數--定義問題

flow span 內存 define target 缺省 位置 cci fec

部分轉自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
  1. class A
  2. {
  3. public:
  4. virtual void pureVirtualFunc() = 0;
  5. };
  6. void A::pureVirtualFunc()
  7. {
  8. cout<<"I‘am pureVirtualFunc"<<endl;
  9. }
  10. class B : public A
  11. {
  12. public:
  13. void pureVirtualFunc() { A::pureVirtualFunc(); cout<<"I belong to B!"; }
  14. };
  15. int main(void)
  16. {
  17. B b;
  18. b.pureVirtualFunc();
  19. return 0;
  20. }

運行結果:

I‘am pureVirtualFunc
I belong to B!請按任意鍵繼續. . .

原來抽象類是可以對純虛函數進行定義的,在其子類中也是可以使用抽象父類的缺省實現!這一切對我來說顯得這麽突然!好像腿腳一軟,站不穩了!是的,以前天天啃個不停個的教材竟然存在如此偏差!等等!好像教材裏也沒錯!裏面並沒有說“不能”進行函數實現,而是根本就沒有提到要去實現。所以老師和天真的我們都默認為不能實現咯!

在此我深深感悟到,目光短淺和學無止境的真正含義了!

虛函數與純虛函數--定義問題