在物件導向的程式設計中,經常會用到類的繼承,目的是保留基類的特性,以減少新類開發的時間。但是,從基類繼承來的某些成員函式不完全適應派生類的需要,例如在例12.2中,基類的display函式只輸出基類的資料,而派生類的display函式需要輸出派生類的資料。過去我們曾經使派生類的輸出函式與基類的輸出函式不同名(如display和display1),但如果派生的層次多,就要起許多不同的函式名,很不方便。如果採用同名函式,又會發生同名覆蓋。
利用虛函式就很好地解決了這個問題。
可以看到:當把基類的某個成員函式宣告為虛函式後,允許在其派生類中對該函式重新定義,賦予它新的功能,並且可以通過指向基類的指標指向同一類族中不同類的物件,從而呼叫其中的同名函式。
由虛函式實現的動態多型性就是:同一類族中不同類的物件,對同一函式呼叫作出不同的響應。
虛函式的使用方法是:
在基類用virtual宣告成員函式為虛函式。
這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫。在類外定義虛函式時,不必再加virtual。
在派生類中重新定義此函式,要求函式名、函式型別、函式引數個數和型別全部與基類的虛函式相同,並根據派生類的需要重新定義函式體。
c++規定,當乙個成員函式被宣告為虛函式後,其派生類中的同名函式都自動成為虛函式。因此在派生類重新宣告該虛函式時,可以加virtual,也可以不加,但習慣上一般在每一層宣告該函式時都加virtual,使程式更加清晰。如果在派生類中沒有對基類的虛函式重新定義,則派生類簡單地繼承其直接基類的虛函式。
定義乙個指向基類物件的指標變數,並使它指向同一類族中需要呼叫該函式的物件。
通過該指標變數呼叫此虛函式,此時呼叫的就是指標變數指向的物件的同名函式。
通過虛函式與指向基類物件的指標變數的配合使用,就能方便地呼叫同一類族中不同類的同名函式,只要先用基類指標指向即可。如果指標不斷地指向同一類族中不同類的物件,就能不斷地呼叫這些物件中的同名函式。這就如同前面說的,不斷地告訴計程車司機要去的目的地,然後司機把你送到你要去的地方。
需要說明;有時在基類中定義的非虛函式會在派生類中被重新定義(如例12.1中的area函式),如果用基類指標呼叫該成員函式,則系統會呼叫物件中基類部分的成員函式;如果用派生類指標呼叫該成員函式,則系統會呼叫派生類物件中的成員函式,這並不是多型性行為(使用的是不同型別的指標),沒有用到虛函式的功能。
以前介紹的函式過載處理的是同一層次上的同名函式問題,而虛函式處理的是不同派生層次上的同名函式問題,前者是橫向過載,後者可以理解為縱向過載。但與過載不同的是:同一類族的虛函式的首部是相同的,而函式過載時函式的首部是不同的(引數個數或型別不同)。
什麼是虛函式
虛函式聯絡到多型,多型聯絡到繼承。所以本文中都是在繼承層次上做文章。沒了繼承,什麼都沒得談。下面是對c 的虛函式這玩意兒的理解。一,什麼是虛函式 如果不知道虛函式為何物,但有急切的想知道,那你就應該從這裡開始 簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來...
什麼是虛函式
在某基類中生命為virtual並在乙個或多個派生類中被重新定義的成員函式,用法格式為 virtual函式返回型別 函式名 引數列表 實現多型性,通過指向派生類的基類指標或引用,訪問派生類中的同名覆蓋函式。虛函式繼承是解決多型性的,當用基類指標指向派生類物件的時候,基類指標呼叫虛函式的時候會自動呼叫派...
C 虛函式 虛表和純虛函式
定義 用virtual修飾的成員函式稱為虛函式 重寫 覆蓋 當在子類中定義了乙個與父類完全相同的虛函式時,則稱這個子類的函式重寫 或覆蓋 了父類的函式 例 includeusing namespace std class person virtual void h1 int b class deri...