c 中虛函式的相關使用方法

2022-10-06 20:24:18 字數 2127 閱讀 7687

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

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

虛方法的特點:

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

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

虛方法的執行:

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

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

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

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

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

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

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

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

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

例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  &nb

}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

}abstractclass b : a   

abstract class c : a

密封類可以有虛函式嗎?

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

複製** **如下:

class a

}sealedclass program:a

staticvoid main(string args)

}本文位址:

虛函式使用方法

虛函式的使用方法 1 在基類用virtual宣告成員函式為虛函式。這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便被呼叫。在類外定義虛函式時,不必在定義virtual 2 在派生類中重新定義此函式,要求函式名,函式型別,函式引數個數和型別全部與基類的虛函式相同,並根據派 生類的需要重新...

虛函式的使用方法

1 在基類用 virtual 關鍵字宣告成員函式為虛函式。這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫 在類 外定義虛函式時,不必再加 virtual 關鍵字。2 在派生類中重新定義此函式,要求函式名 函式型別 函式引數個數和型別全部與 基類的虛函式相同,並根據派生類的需要...

乾貨 C 虛函式的使用方法

虛函式的作用 虛函式的使用方法 在什麼情況下應該宣告虛函式 使用虛函式時,有兩點要注意 只有類的成員函式才能被宣告虛函式,即虛函式只用於類的繼承層次結構中 乙個成員函式被宣告為虛函式後,在同一類族中的類就不能再定義乙個該虛函式同名 同型別和同引數同名非虛函式。使用虛函式,系統要有一定的額外空間開銷。...