C 基礎 七)虛函式

2022-03-01 13:32:24 字數 2059 閱讀 1821

若乙個例項方法宣告前帶有virtual關鍵字,那麼這個方法就是虛方法。

虛方法與非虛方法的最大不同是,虛方法的實現可以由派生類所取代,這種取代是通過方法的重寫實現的(以後再講)

虛方法的特點:

虛方法前不允許有static,abstract,或override修飾符

虛方法不能是私有的,因此不能使用private修飾符

虛方法的執行:

我們知道一般函式在編譯時就靜態地編譯到了執行檔案中,其相對位址在程式執行期間是不發生變化的,

而虛函式在編譯期間是不被靜態編譯的,它的相對位址是不確定的,它會根據執行時期物件例項來動態判斷要呼叫的函式,

其中那個申明時定義的類叫申明類,那個執行時例項化的類叫例項類。

如:a a =new b(); 其中a是申明類,b是例項類。

1.當呼叫乙個物件的函式時,系統會直接去檢查這個物件申明定義的類,即申明類,看所呼叫的函式是否為虛函式;

2.如果不是虛函式,那麼它就直接執行該函式。而如果是乙個虛函式,那麼這個時候它就不會立刻執行該函式了,而是開始檢查物件的例項類。

3.在這個例項類裡,他會檢查這個例項類的定義中是否有實現該虛函式或者重新實現該虛函式(通過override關鍵字)的方法,

如果有,它就不會再找了,而是馬上執行該例項類中實現的虛函式的方法。而如果沒有的話,系統就會不停地往上找例項類的父類,

並對父類重複剛才在例項類裡的檢查,直到找到第乙個過載了該虛函式的父類為止,然後執行該父類裡過載後的函式。

例1:

class a

}class program

}

執行a.sum:

1.先檢查申明類a 2.檢查到是sum是虛擬方法 3.轉去檢查例項類a,結果是題本身 

4.執行例項類a中實現sum的方法 5.輸出結果 i am a class,i am virtual sum(). 

例2:

class a

}class b : a

}class program

}

執行a.sum:

1.先檢查申明類a 2.檢查到是虛擬方法 3.轉去檢查例項類b,有重寫的方法 4.執行例項類b中的方法 5.輸出結果 i am b class,i am override sum().

例3:

class a

}class b : a

}class c : b

class program

}

執行a.sum:

1.先檢查申明類a 2.檢查到是虛擬方法 3.轉去檢查例項類c,無重寫的方法 4.轉去檢查類c的父類b,有重寫的方法

5.執行父類b中的sum方法 6.輸出結果 i am b class,i am override sum().  

例4:

class a

}class b : a

}class program

}

執行a.sum:

1.先檢查申明類a 2.檢查到是虛擬方法 3.轉去檢查例項類b,無重寫的(這個地方要注意了,雖然b裡有實現sum(),但沒有使用override關鍵字,所以不會被認為是重寫) 4.轉去檢查類b的父類a,就為本身 5.執行父類a中的sum方法 6.輸出結果 i am a class,i am virtual sum().  

那麼如果在例4裡,申明的是類b呢?

class a

}class b : a

}class program

}

執行b類裡的sum(),輸出結果i am b class,i am new sum(). 

可以使用抽象函式重寫基類中的虛函式嗎?

答案是可以的。

class a

}abstract class b : a

abstract class c : a

密封類可以有虛函式嗎?

可以,基類中的虛函式將隱式的轉化為非虛函式,但密封類本身不能再增加新的虛函式

class a

}sealed class program:a

static void main(string args)

}

七 多型 虛函式表(C )

內容參考於 21天學通c 第八版 不去糾結c 的原理和細節,從c的角度去學習c 再通過c 專案去加深理解 1.示例class base virtual void func2 so on and so forth virtual void funcn class derived public base...

C 基礎 虛函式 純虛函式 普通函式

為什麼要使用虛函式 說明 為什麼要使用純虛函式 什麼情況下使用純虛函式 滿足以上兩點,可考慮宣告為純虛函式。例1 class a 輸出結果 function in class a function in class a function in class b function in class a ...

c 基礎系列 虛函式 虛表

歡迎來到c 基礎系列的部落格 我們剛才例項化物件的時候,示例一直豬是這樣寫的 pig pig new pig 但因為其是繼承animal動物類的,所以說我們其實也可以這樣寫 animal pig new pig 這種寫法一般情況下沒有毛病,但是如果子類重寫了基類的方法時,就會出現問題 呼叫的還是基類...