前一篇隱藏的例項中,由於子類隱藏了父類的同名方法,如果不進行強制轉換,就無法通過父類變數直接呼叫子類的同名方法,哪怕父類變數引用的是子類變數。
我們希望的是每個物件「各司其職」。
為了達到這個目的,可以在父類同名方法前加關鍵字virtual,表明這是乙個虛方法,子類可以重寫此方法:即在子類同名方法前加關鍵字override,表明這是對父類同名方法進行了重寫。
請看如下**:
1請看一下使用**(在主函式中呼叫):class parent //父類2
7}8class child : parent //
子類繼承父類
914 }
1 child c = new上述**執行的結果:child();
2parent p;
3 p =c;
4 p.overridef();//
呼叫父類的還是子類的同名方法?
這一事例表明,將父類方法定義為虛方法,子類重寫同名方法之後,通過父類變數呼叫此方法,到底是呼叫父類還是子類的,由父類變數引用的真實物件型別決定,而與父類變數無關。
換句話說,同樣一句**:
p.overridef();在p引用不同物件時,其執行的結果完全不一樣!因此,如果我們再程式設計時只針對父類變數提供的對外介面程式設計,就是我們的**成了「變色龍」,傳給它不同的子類物件(這些子類物件都重寫了父類的同名方法),它就會做不同的事。這就是物件導向語言中的「虛方法呼叫」特性。這一特性會讓我們寫出非常靈活的**,大大減少由於系統功能擴充和改變帶來的大量**修改工作量。
結論:物件導向怨言擁有的「虛方法呼叫」特性,使我們可以只用同樣的乙個語句,在執行時根據物件型別而執行不同的操作。
虛方法與重寫方法
在c 中,繼承,虛方法,與重寫方法結合在一起才能實現多型性 虛方法是指允許其子類重新定義的方法的方法,在宣告時,需要使用virtual修飾符,不能是私有的 public virtual int add int a,int b return a b 重寫方法也稱覆蓋,是在派生類使用override修飾...
05 方法重寫
在繼承關係中,子類如果定義了乙個與父類方法簽名完全相同的方法,被稱為覆寫 override 加上 override可以讓編譯器幫助檢查是否進行了正確的覆寫。例如,在person類中,我們定義了run 方法 class person 在子類student中,覆寫這個run 方法 class stude...
20207 23方法重寫與抽象多型
一 方法的重寫或方法的覆蓋 1.子類根據需求對父類繼承的方法進行重新編寫 2.重寫時,可以用super.方法的方式來保留父類的方法 注意 構造方法無法被重寫!3.方法重寫規則 在繼承的情況下,子類的方法滿足以下條件 1.方法名相同,引數列表相同 2.返回值型別相同或者是其父類返回值的子類 3.父類的...