虛函數是在超類中定義的函數,它必須存在于子類中才能有完整的類定義。虛函數依賴于稱為虛繼承的面向對象編程范式,這在C中最常見的是使用“virtual”關鍵字。要定義虛函數,有兩個類是必需的,一個超類和一個子類。超類是首...
虛函數是在超類中定義的函數,它必須存在于子類中才能有完整的類定義。虛函數依賴于稱為虛繼承的面向對象編程范式,這在C中最常見的是使用“virtual”關鍵字。要定義虛函數,有兩個類是必需的,一個超類和一個子類。超類是首先聲明函數的地方,也可能是定義函數的地方。子類是定義函數或重寫函數的地方,這取決于函數是否在超類中定義。要定義虛函數,需要兩個類,一個超類和一個子類。虛函數可以用兩種方法之一來定義:第一,它可以定義為存根,在存根中它有一個空的主體,什么也不做;第二個,它可以定義為一個純虛函數,在超類的頭文件中,它被定義為NULL。這兩種方法各有優缺點。將函數定義為存根可以確保所有子類都能實現它,即使它什么都不做。但是,如果忘記重寫函數并在子類中正確實現它,不會出現任何錯誤或警告來指出這一點。另一方面,定義純虛函數要求每個子類都有自己的函數定義,如果不是這樣,就會出現錯誤。但是,虛擬函數與非虛函數遵循相同的繼承規則,因此,兩級以上的繼承層次結構可能不需要顯式定義虛函數,例如可以考慮一個聲明虛函數的類a,它是在子類B中實現的,B類有自己的子類,C類不需要顯式定義類a~s函數,因為它繼承了B類的定義如有必要,C類可以重寫類B~s函數,也可以在調用類B~s函數的同時重寫它。另一個極端是,如果虛函數在子類中聲明為虛函數,則不必在該子類中定義。例如,可以考慮聲明虛函數并有兩個子類B的類a另外,我們可以想象B類有D和E的子類,C類有F和G的子類。B類到G類都必須定義A~s類的虛函數。如果B類有A~s函數的實現,D類和E類不需要重做。也許C~s子類需要實現A~s函數,但是它們都做了一些不同的事情,所以在C類中定義函數本身就沒什么用了。在這種情況下,函數在C類中可能被聲明為虛函數,并且不需要實現。虛擬函數學習起來可能會令人望而生畏,但如果使用得當,它們可以減少代碼重復并使代碼更易于理解一般來說,虛函數有很多缺陷,尤其是在多重繼承方面。在多重繼承中,模糊定義的虛函數可能會相互沖突,因此在這種情況下應謹慎使用
-
發表于 2020-08-06 19:59
- 閱讀 ( 700 )
- 分類:電腦網絡