C 之過載與覆蓋

2021-09-06 04:23:49 字數 2352 閱讀 1851

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 之過載與覆蓋

overload 過載指的是同乙個類 中有兩個或多個名字相同但是引數不同 的方法,注 返回值不能區別函式是否過載 過載沒有關鍵字。override 重寫是指子類對父類中虛函式或抽象函式 的 覆蓋 這也就是有些書將過載翻譯為覆蓋的原因 但是這種 覆蓋 和用new關鍵字來覆蓋是有區別的。new 覆蓋指的...

c 覆蓋 過載與隱藏

成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 具體分為引數個數不同 引數型別不同 const 4 virtual 關鍵字可有可無。覆蓋是指派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與基類 2 函式名字相同 3 引數相同 4 基類函式必須有vi...

過載與覆蓋

過載 方法名相同,引數列表不同 引數型別 引數個數和引數順序不同 覆蓋 1.子修飾符訪問許可權不能比父類修飾符的許可權低 2.被覆蓋的方法 父類方法 不能用final staic private 修飾 覆蓋和過載的不同 方法覆蓋要求引數列表必須一致,而方法過載要求引數列表必須不一致。方法覆蓋要求返回...