虛函式和過載

2022-02-08 05:35:26 字數 1104 閱讀 1982

面試必考。。。。。

1 #include 2

class

cbase39

10void g(float

x)11

14};

1516

//繼承類 cderived

17class cderived:public

cbase

1824

public:25

26void g(float

x)27

30};

3132

33void

main()

34

輸出結果為:

cderived::f 函式列印:整數3

cderived:g 函式列印:浮點小數6.000000

cderived::f 函式列印:整數3

cbase::g 函式列印:浮點小數6.000000

如果將繼承類物件轉換為基類物件去呼叫 f 和 g ,就不一定呼叫繼承類本身的函式。因為基類cbase 的函式 f 為 virtual 虛函式,而繼承類 cderived 又過載了該函式,於是基類的函式 f 【被覆蓋】掉,從而 cbase 類的函式實際是 cderived::f 和 cbase::g。所以,利用轉換為基類的物件 *pbaseobj 呼叫 f函式,仍然是繼承類本身定義的函式;但呼叫 g 函式,則是基類的 g 函式,而不是繼承類本身的函式g。這種呼叫是需要提防的,可能產生混亂。

由此可見,如果乙個類的函式希望做的靈活一些,允許繼承類的過載函式修改它,最好將它宣告為 virtual 虛函式。乙個函式一經宣告為 virtual 函式,它在繼承類中的過載函式,也是虛函式,不必再用virtual 進行修飾。

此外,如果在虛函式的宣告之後加上 "=0" 的標記,函式就成為純虛函式。乙個類包含純虛函式的定義,該類稱為抽象類。抽象類不能建立物件,作為繼承類的【介面】規範,要求繼承類必須提供乙個純虛函式的具體實現,否則產生編譯錯誤。

如下是純虛函式的一般定義:

virtual  函式返回值型別  函式名(  引數列表 ) =0;

一句話總結:虛函式是為了實現【多型】; 純虛函式是為了實現【介面】;

暫時只討論這麼多,後續還會再補充........

函式過載和虛函式繼承

include class cbase void g float x class cberived public cbase void g float x void main 輸出結果 cberived f 函式列印 整數 3 cberived g 函式列印 浮點小數 6.000000 cberiv...

過載覆蓋多型和虛函式

現在整理出來,希望可以記住這個。函式的名稱一樣,但是引數不同,就是過載 函式的名稱知道了,但是編譯的時候不知道呼叫哪個函式,過載決議 根據引數決定到底應該呼叫哪個函式 區別就是 呼叫的引數不一樣 對於非虛函式,子類和基類同名 不管引數 那麼就是導致覆蓋 如果引數完全一樣,那麼會完全覆蓋,只會留下子類...

C 虛函式覆蓋 過載

cbase類處於作用域的外層,派生類的方法對於其將是不可見的,即隱藏的。而在派生類中,如果有過載函式時,基類函式將會被隱藏,否則基類函式就不被隱藏。includeusing namespace std 基類 class cbase virtual void jump void run int spe...