什麼是虛方法?

2021-04-12 20:07:56 字數 1533 閱讀 3012

什麼是「虛方法"?

2006-10-20 03:23

當例項方法宣告包含virtual修飾符時,稱該方法為虛擬方法。不存在virtual修飾符時,稱該方法為非虛擬方法。    

非虛擬方法的實現是不變的:無論是在宣告它的類的例項上呼叫該方法還是在派生類的例項上呼叫,實現都是相同的。與此相反,虛擬方法的實現可以由派生類取代。取代所繼承的虛擬方法之實現的過程稱為重寫方法    

在虛擬方法呼叫中,為其進行呼叫的例項的執行時型別確定要呼叫的實際方法實現。在非虛擬方法呼叫中,例項的編譯時型別是決定性因素。準確地說,當在具有編譯時型別c和執行時型別r的例項(其中r為c或者從c派生的類)上用引數列表a呼叫名為n的方法時,呼叫按下面這樣處理:

首先,將過載決策應用於c、n和a,以從在c中宣告和由c繼承的方法集中選擇乙個特定方法 m。    

然後,如果m 為非虛擬方法,則呼叫m。    

否則,m 為虛擬方法,呼叫就 r 而言 m 的派生程度最大的實現。    

對於在類中宣告或者由類繼承的每個虛擬方法,存在乙個就該類而言的派生程度最大的實現。就類r而言虛擬方法m的派生度最大的實現按下面這樣確定:    

如果r包含m的引入virtual 宣告,則這是m的派生程度最大的實現。    

否則,如果r包含m的override,則這是m的派生程度最大的實現。    

否則,m的派生程度最大的實現與r的直接基類的派生程度最大的實現相同。    

下列例項闡釋虛擬方法和非虛擬方法之間的區別:      

class   a  

public  virtual  void   g()   

}  class   b:   a  

public override void g()    

}  class   test  

}  在該示例中,a引入乙個非虛擬方法f和乙個虛擬方法g。類b引入乙個新的非虛擬方法   f,從而隱藏了繼承的f,並且還重寫了繼承的方法g。此例產生下列輸出:

a.f  

b.f  

b.g  

b.g  

請注意,語句a.g()呼叫b.g而不是a.g。這是因為是例項的執行時型別(即b)而不是例項的編譯時型別(即a)確定要呼叫的實際方法實現。  

由於允許方法隱藏繼承的方法,因此類可以包含具有相同簽名的若干個虛擬方法。由於除派生程度最大的方法外全部都被隱藏,因此這不會造成多義性問題。在下面的示例中,     

class   a  

}  class   b: a  

}  class   c: b  

}  class   d:   c  

}  class   test  

}  c類和d類包含兩個具有相同簽名的虛擬方法:a引入的虛擬方法和c引入的虛擬方法。c引入的方法隱藏從a繼承的方法。因此,d中的重寫宣告重寫c引入的方法,而d不可能重寫a引入的方法。此例產生下列輸出:   

b.f  

b.f  

d.f  

d.f  

請注意,可以通過訪問d的例項(通過在其中未隱藏方法的派生程度較小的型別)呼叫隱藏的虛擬方法。  

什麼是虛方法

虛方法使用起來比較簡單,但很難理解,對乙個沒有聽過說虛方法的人用概念很難向他解釋清楚,那麼下面小雨用乙個例子讓大家明白到底什麼是虛方法。為了不讓大家眼花,我就不在這麼寫 了,用文字描述,假設我們的程式中有乙個父類animal,兩個子類bird和pig,父類中有乙個move 方法,那麼子類bird和p...

什麼是虛函式

虛函式聯絡到多型,多型聯絡到繼承。所以本文中都是在繼承層次上做文章。沒了繼承,什麼都沒得談。下面是對c 的虛函式這玩意兒的理解。一,什麼是虛函式 如果不知道虛函式為何物,但有急切的想知道,那你就應該從這裡開始 簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來...

什麼是虛函式

在某基類中生命為virtual並在乙個或多個派生類中被重新定義的成員函式,用法格式為 virtual函式返回型別 函式名 引數列表 實現多型性,通過指向派生類的基類指標或引用,訪問派生類中的同名覆蓋函式。虛函式繼承是解決多型性的,當用基類指標指向派生類物件的時候,基類指標呼叫虛函式的時候會自動呼叫派...