虛函數使得設計和實現易於擴展的系統成為了可能。程序可以對層次中所有現有類的對象(基類對象)進行一般性處理。
現在我們假設一組形狀類(如圓形、正方形、長方形等)都是從基類Shape中派生出來的,在面向對象的程序設計中,我們可能要使每一個這樣的類都能繪制其自身的形狀,盡管每個類都有自己的Draw函數,但是繪制每種形狀的Drew函數是不可能相同的。
但是當需要繪制形狀時,不管它是什麼形狀,把它作為基類Shape的對象處理是最好不過的了。然後我們只需要簡單的調用基類Shape的函數Drew,並讓程序動態的確定(即在運行中確定)使用哪個派生類的Draw函數。
為了使這種行為可行,我們需要把基類中的函數Draw聲明為虛函數。然後在每個派生類中重新定義Draw使之能夠繪制合適的形狀。
虛函數的聲明方法是在基類的函數原型前加上關鍵字virtual,例如,基類Shape中可能出現:
virtual void draw() const;
這個聲明就表明draw是不取參,也不返回數值的常量函數,而且是個虛函數。
這時便可用基類指針或者指明派生類對象並使用該指針調用Draw函數(如shapePr->draw()),則程序會動態的調用該派生類的draw函數,這便稱之為動態關聯。
如果用名字和圓點成員選擇運算符引用一個特定的對象來調用虛函數(如shapeObject.draw()),則被調用的虛函數是在編譯時確定的,這便是靜態關聯。
編程技巧:
1、為了提高程序的清晰性,我們最好在類的每一個層次中顯示聲明這些虛函數。
2、沒有定義虛函數的派生類簡單的繼承了其直接基類的虛函數。
3、一旦一個函數被聲明為虛函數,那麼重新定義類時即使沒有聲明這個虛函數,那麼以此為點,在之後的繼承類層結構中都是虛函數。
作者 李木