C 過載 覆蓋 重寫區別

2021-06-29 13:36:04 字數 2039 閱讀 6932

overload:

過載指的是同乙個類

中有兩個或多個名字相同但是引數不同

的方法,(注:返回值不能區別函式是否過載),過載沒有關鍵字

。override:

過載也稱重寫是指子類對父類中虛函式或抽象函式

的「覆蓋」(這也就是有些書將過載翻譯為覆蓋的原因),但是這種「覆蓋」和用new關鍵字來覆蓋是有區別的。

new:

覆蓋指的是不同類中(基類或派生類)有兩個或多個返回型別、方法名、引數都相同,但是方法體不同的方法。

但是這種覆蓋是一種表面上的覆蓋,所以也叫隱藏

,被覆蓋的父類方法是可以呼叫得到的。

過載覆蓋的發生條件:

過載,必然發生在乙個類中,函式名相同,引數型別或者順序不同構成過載,與返回型別無關

重寫,必然發生在基類和派生類中,其類函式用virtual修飾,派生類用override修飾

覆蓋,在子類中寫乙個和基類一樣名字(引數不同也算)的非虛函式,會讓基類中的函式被隱藏,編譯後會提示要求使用new關鍵字

過載示例:

public

void

fun()

public

void

fun(

inti)

",i);

}

override重寫特性:

由 override 宣告重寫的方法稱為重寫基方法,

重寫的基方法必須與 override 方法具有相同的簽名。

重寫的基方法必須是 virtual、abstract 或 override 的

,不能重寫非虛方法或靜態方法

。override的方法和virtual的方法必須具有相同的訪問級別修飾符

,不能更改 virtual 方法的可訪問性

。不能使用new、static 或 virtual 修飾符來修改 override 方法。

重寫屬性宣告必須指定與繼承屬性完全相同的訪問修飾符、型別和名稱,並且被重寫的屬性必須是virtual、abstract 或 override 的。

覆蓋示例:

當我們沒有使用覆蓋時,派生類繼承基類,結果如下:

classa}

class

program:a

}//結果為:i am f

當我們覆蓋原來的方法呢?

classa}

class

program:a

", i);

}static

void

main(

string

args)

}//結果為:i am f,i=1

new覆蓋與重寫、過載的區別:

當子類與父類的引數不同時

當基類函式不是虛函式時,基類函式將被隱藏。(因為子類和基類不在同一範圍內,所以不是過載)

當基類函式是虛函式時,基類函式將被隱藏。(

因為子類和基類不在同一範圍內,所以不是過載;因為引數不同,所以不是重寫

)當子類與父類的引數相同時

當基類函式不是虛函式時,基類函式將被隱藏。(

因為子類和基類不在同一範圍內,所以不是過載,

因為基類不是虛函式,所以是隱藏不是重寫)

當基類函式是虛函式時,基類函式將被覆蓋。(

因為子類和基類不在同一範圍內,所以不是過載)

那麼為什麼不是重寫呢?我們可以做乙個例子還測試一下,這個例子在虛函式時已經舉過,在這裡為了說明此問題在重複一下:

classa}

class

program:a

", i);

}static

void

main(

string

args)

}

我們知道,以上例子中,派生類存在乙個對基類的重寫方法,所以結果為:i am f ,i=1

若是我們把override換成new,那麼如果是重寫的話,會和上面的結果相等,但實際結果是什麼呢?

實際的結果是:i am f

由此我們知道,

當基類函式是虛函式時,基類函式不是重寫,而是覆蓋了基函式的同名函式。

c 覆蓋 重寫 過載

乙個抽象方法,介面,標記為virtual的方法,你在派生類中去實現,或者改寫他的功能,叫重寫 在父類中定義了乙個方法如 public string getname 方法,在派生類中再次定義了乙個同樣的方法public string getname 則派生類覆蓋了父類的方法 覆蓋重寫的區別 重寫 pu...

重寫(覆蓋) 過載的區別

override 覆蓋 重寫 物件 方法 解釋 重寫乙個方法,以實現不同的功能 用於 子類繼承父類的方法,重寫 重現實現 繼承 寫新方法 父類的方法 規則 1 引數列表相同,否則為過載而非重寫 2 訪問修飾符大於被重寫方法 public protected default private 3 返回值...

C 過載和重寫 覆蓋

何為重寫?重寫 override 指子類修改父類中某個函式的函式體,需要重寫的父類中的函式必須是由virtual abstract 或 override標註的,不能重寫非虛方法或靜態方法。override是在繼承的時候,如果你寫的函式與要繼承的函式函式特徵 函式特徵包括函式名,引數的型別和個數 相同...