虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。
例:基類與派生類中有同名函式。
在下面的程式中student是基類,graduate是派生類,它們都有display這個同名的函式。
#include
#include
using namespace std;
//宣告基類student
class student
void student::display( ) //定義輸出函式
//主函式
int main()
{student stud1(1001,″li″,87.5); //定義student類物件stud1
graduate grad1(2001,″wang″,98.5,563.5); //定義graduate類物件grad1
student *pt=&stud1; //定義指向基類物件的指標變數pt
pt->display( );
pt=&grad1;
pt->display( );
return 0;
執行結果如下,請仔細分析。
num:1001(stud1的資料)
name:li
score:87.5
num:2001 (grad1中基類部分的資料)
name:wang
score:98.5
下面對程式作一點修改,在student類中宣告display函式時,在最左面加乙個關鍵字virtual,即
virtual void display( );
這樣就把student類的display函式宣告為虛函式。程式其他部分都不改動。再編譯和執行程式,請注意分析執行結果:
num:1001(stud1的資料)
name:li
score:87.5
num:2001 (grad1中基類部分的資料)
name:wang
score:98.5
pay=1200 (這一項以前是沒有的)
由虛函式實現的動態多型性就是: 同一類族中不同類的物件,對同一函式呼叫作出不同的響應。虛函式的使用方法是:
(1) 在基類用virtual宣告成員函式為虛函式。這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫。
在類外定義虛函式時,不必再加virtual。
(2) 在派生類中重新定義此函式,要求函式名、函式型別、函式引數個數和型別全部與基類的虛函式相同,並根據派生類的需要重新定義函式體。
c++規定,當乙個成員函式被宣告為虛函式後,其派生類中的同名函式都自動成為虛函式。因此在派生類重新宣告該虛函式時,可以加virtual,也可以不加,但習慣上一般在每一層宣告該函式時都加virtual,使程式更加清晰。
如果在派生類中沒有對基類的虛函式重新定義,則派生類簡單地繼承其直接基類的虛函式。
(3) 定義乙個指向基類物件的指標變數,並使它指向同一類族中需要呼叫該函式的物件。
(4) 通過該指標變數呼叫此虛函式,此時呼叫的就是指標變數指向的物件的同名函式。
通過虛函式與指向基類物件的指標變數的配合使用,就能方便地呼叫同一類族中不同類的同名函式,只要先用基類指標指向即可。如果指標不斷地指向同一類族中不同類的物件,就能不斷地呼叫這些物件中的同名函式。這就如同前面說的,不斷地告訴計程車司機要去的目的地,然後司機把你送到你要去的地方。
需要說明;有時在基類中定義的非虛函式會在派生類中被重新定義,如果用基類指標呼叫該成員函式,則系統會呼叫物件中基類部分的成員函式;如果用派生類指標呼叫該成員函式,則系統會呼叫派生類物件中的成員函式,這並不是多型性行為(使用的是不同型別的指標),沒有用到虛函式的功能。
以前介紹的函式過載處理的是同一層次上的同名函式問題,而虛函式處理的是不同派生層次上的同名函式問題,前者是橫向過載,後者可以理解為縱向過載。但與過載不同的是: 同一類族的虛函式的首部是相同的,而函式過載時函式的首部是不同的(引數個數或型別不同)。
虛函式的作用
虛函式的作用是實現動態聯編,也就是在程式的執行階段動態地選擇合適的成員函式,在定義了虛函式後,可以在基類的派生類中對虛函式重新定義,在派生類中重新定義的函式應與虛函式具有相同的形參個數和形參型別。以實現統一的介面,不同定義過程。如果在派生類中沒有對虛函式重新定義,則它繼承其基類的虛函式。當程式發現虛...
虛函式的作用
虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。例 基類與派生類中有同名函式。在下面的程式中student是基類,graduate是派生類,它們都有display這個同名的函式。include include using namespa...
虛函式的作用
虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。例 基類與派生類中有同名函式。在下面的程式中student是基類,graduate是派生類,它們都有display這個同名的函式。include include using namespa...