關於虛函式

2021-06-22 14:39:02 字數 1237 閱讀 4001

虛函式的作用是實現

動態聯編

,也就是在程式的執行階段動態地選擇合適的

成員函式

,在定義了虛函式後,可以在基類的

派生類中對虛函式重新定義,在派生類中重新定義的函式應與虛函式具有相同的

形參個數和形參型別。以實現統一的介面,不同定義過程。如果在

派生類中沒有對虛函式重新定義,則它繼承其

基類的虛函式

。簡單地說,那些被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 時只析構基類的物件而不析構派生類的物件。基類指標指向派生類的的情況下,基類的虛構要設為虛析構。虛表合併時向內層合併,虛表合併時會先拷貝乙份副本,然後合併的時候使用副本合併。虛函式表的生成在編譯器...