學習過c++類的繼承與多型的時候,但是很多的童鞋回過頭來都忘記之中關於虛函式和純虛函式的細節,甚至將他們混淆。
虛函式是動態多型性的基礎,其呼叫的方式是動態聯編(又稱晚期聯編,簡單解釋為只有在程式執行時才決定呼叫基類的還是子類的,系統會根據基類指標所指向的物件來決定要呼叫的函式);
非虛函式與其相反,是靜態聯編(呼叫已經在編譯時期就決定了;在編譯時期,系統已經根據指標所屬的型別確定了要呼叫的函式)。
classshape
;
void
draw()
};class rectangle : public
shape
;
void
draw()
};class round : public
shape
;
void
draw()
};void
main()
我主程式中的意思是要畫方形和畫圓形,可執行的結果都是畫圖形(叫你兩兒子出來,怎麼出來的都是你啊,扯淡麼),這很明顯不符合我們的要求和多型的要求。所以虛函式必須應運而生。
classshape
;
virtual
void draw() //
注意這裡設定為虛函式
};class rectangle : public
shape
;
void
draw()
};class round : public
shape
;
void
draw()
};void
main()
這就滿足我們了,乙個是畫方形,乙個是畫圓形。
發現:即使不在基類shape當中把draw設定為虛函式,我們只要直接在主函式當中直接宣告子類的物件,呼叫draw,這種情況下是符合多型的思想的,
voidmain()
這就有疑問了,為什麼還需要virtual關鍵
字(虛函式)的存在呢?
上面的例子只是乙個兩個派生類,如果shape有成百上千個派生類,難道我們呼叫派生類的draw的時候都宣告乙個派生類的物件嗎?很明顯不可能,所以虛函式的情況下,我們只要宣告乙個shape的指標就好了。
如果需要了解 c++ 多型的實現機制, 請參看: c++ 多型實現機制
傳送門:
c++虛函式和純虛函式(2)
2011-12-08
C 虛函式和純虛函式(1)
寫在前面的 學習過c 類的繼承與多型的時候,但是很多的童鞋回過頭來都忘記之中關於虛函式和純虛函式的細節,甚至將他們混淆。虛函式是動態多型性的基礎,其呼叫的方式是動態聯編 又稱晚期聯編,簡單解釋為只有在程式執行時才決定呼叫基類的還是子類的,系統會根據基類指標所指向的物件來決定要呼叫的函式 非虛函式與其...
c 虛函式和純虛函式
虛函式 定義 在基類中用virtual宣告,不一定不被實現,可以用基類的指標來呼叫子類的對應函式,實現成員函式的動態過載。子類virtual可寫可不寫,編譯器自動加上。1.以下繼承後的print 相當於重寫,兩個類print 方法輸出結果不同 class a 2.加了vitual 定義為虛函式以後,...
C 虛函式和純虛函式
首先 強調乙個概念 定義乙個函式為虛函式,不代表函式為不被實現的函式。定義他為虛函式是為了允許用基類的指標來呼叫子類的這個函式。定義乙個函式為純虛函式,才代表函式沒有被實現。定義純虛函式是為了實現乙個介面,起到乙個規範的作用,規範繼承這個類的程式設計師必須實現這個函式。1 簡介 假設我們有下面的類層...