overload:過載指的是同乙個類中有兩個或多個名字相同但是引數不同的方法,(注:返回值不能區別函式是否過載),過載沒有關鍵字。
override:過載也稱重寫是指子類對父類中虛函式或抽象函式的「覆蓋」(這也就是有些書將過載翻譯為覆蓋的原因),但是這種「覆蓋」和用new關鍵字來覆蓋是有區別的。
new:覆蓋指的是不同類中(基類或派生類)有兩個或多個返回型別、方法名、引數都相同,但是方法體不同的方法。
但是這種覆蓋是一種表面上的覆蓋,所以也叫隱藏,被覆蓋的父類方法是可以呼叫得到的。
過載覆蓋的發生條件:
過載,必然發生在乙個類中,函式名相同,引數型別或者順序不同構成過載,與返回型別無關
重寫,必然發生在基類和派生類中,其類函式用virtual修飾,派生類用override修飾
覆蓋,在子類中寫乙個和基類一樣名字(引數不同也算)的非虛函式,會讓基類中的函式被隱藏,編譯後會提示要求使用new關鍵字
過載示例:
publicvoid
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 修飾 覆蓋和過載的不同 方法覆蓋要求引數列表必須一致,而方法過載要求引數列表必須不一致。方法覆蓋要求返回...