虛函式的作用是實現
動態聯編
,也就是在程式的執行階段動態地選擇合適的
成員函式
,在定義了虛函式後,可以在基類的
派生類中對虛函式重新定義,在派生類中重新定義的函式應與虛函式具有相同的
形參個數和形參型別。以實現統一的介面,不同定義過程。如果在
派生類中沒有對虛函式重新定義,則它繼承其
基類的虛函式
。簡單地說,那些被virtual關鍵字修飾的
成員函式
,就是虛函式。虛函式的作用,用專業術語來解釋就是實現多
態性,多型性是將介面與實現進行分離;
用形象的語言來解釋就是實現以共同的方法,但因個體差異而採用不同的策略
。來看下面簡單**
class a
我們希望pb->print()輸出this is b,但實際上結果如下:
問題來了,p2明明指向的是class b的物件但卻是呼叫的class a的print()函式,這不是我們所期望的結果,那麼解決這個問題就需要用到虛函式:
class a
{public:
virtual void print(){ cout<
void print(){ cout<
毫無疑問,class a的
成員函式
print()已經成了虛函式,那麼class b的print()成了虛函式了嗎?回答是yes,
我們只需在把基
類的成員函式
設為virtual,其
派生類的相應的函式也會自動變為虛函式。
所以,class b的print()也成了虛函式。那麼對於在
派生類的相應函式前是否需要用virtual關鍵字修飾,看個人習慣。
每個含有虛函式的類有一張虛函式表(vtbl),表中每一項是乙個虛函式的位址, 也就是說,虛函式表的每一項是乙個虛函式的指標。
沒有虛函式的c++類,是不會有虛函式表的。
兩張圖:
關於虛函式
1.int aobj 得到了虛函式表指標的位址 vptr 2.int int aobj 得到虛函式表指標vptr 指標的型別是 int 這時需要轉化下 3.vptr是指向vptr table,其實就是指向乙個陣列,陣列元素是函式指標。int int aobj 指向陣列第乙個元素 所以 int int...
關於C 虛函式 純虛函式
1.虛函式與純虛函式的區別 答 定義乙個函式為虛函式,不代表函式為不被實現的函式,定義它為虛函式是為了允許用基類的指標來呼叫子類的這個函式 定義乙個函式為純虛函式,才代表函式沒有被實現,定義他是為了實現乙個介面,起到乙個規範的作用,規範繼承這個類的程式設計師必須實現這個函式。2.基類中定義的虛函式,...
關於虛函式和虛繼承
基類中無虛函式,派生類中有虛函式,基類的指標指向派生類物件 指向的是派生類中基類的起始部分 delete 時只析構基類的物件而不析構派生類的物件。基類指標指向派生類的的情況下,基類的虛構要設為虛析構。虛表合併時向內層合併,虛表合併時會先拷貝乙份副本,然後合併的時候使用副本合併。虛函式表的生成在編譯器...