最近一直在刷面試題,遇到「過載與覆蓋的區別」,於是記錄一波。方法的覆蓋是子類和父類之間的關係,是垂直關係;方法的過載是同乙個類中方法之間的關係,是水平關係。
覆蓋只能由乙個方法,或只能由一對方法產生關係;方法的過載是多個方法之間的關係。
覆蓋要求引數列表相同;過載要求引數列表不同。
覆蓋關係中,呼叫那個方法體,是根據物件的型別(物件對應儲存空間型別)來決定;過載關係,是根據呼叫時的實參表與形參表來選擇方法體的。
override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了乙個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對介面方法的實現,在介面中一般只是對方法進行了宣告,而我們在實現時,就需要實現介面宣告的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點:
覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;
覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
覆蓋的方法所丟擲的異常必須和被覆蓋方法的所丟擲的異常一致,或者是其子類;
被覆蓋的方法不能為private,否則在其子類中只是新定義了乙個方法,並沒有對其進行覆蓋。
執行時的多型性就是指直到系統執行時,才根據實際情況決定實現何種操作。c#中,執行時的多型性通過虛成員實現。編譯時的多型性為我們提供了執行速度快的特點,而執行時的多型性則帶來了高度靈活和抽象的特點。
overload對我們來說可能比較熟悉,可以翻譯為過載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入引數來區分這些方法,然後再呼叫時,vm就會根據不同的引數樣式,來選擇合適的方法執行。在使用過載要注意以下的幾點:
在使用過載時只能通過不同的引數樣式。例如,不同的引數型別,不同的引數個數,不同的引數順序(當然,同一方法內的幾個引數型別必須不一樣,例如可以是fun(int, float), 但是不能為fun(int, int))(我試了一下可以的);
不能通過訪問許可權、返回型別、丟擲的異常進行過載;
方法的異常型別和數目不會對過載造成影響;
編譯時的多型性是通過過載來實現的。對於非虛的成員來說,系統在編譯時,根據傳遞的引數、返回的型別等資訊決定實現何種操作。
過載與覆蓋的區別
1.過載 overload 指的是乙個class中多個同名方法,其引數的個數和型別不同。如果引數的個數和型別相同但是返回值型別不同,則不構成過載,反證 我們有時候呼叫方法的時候,不關注返回值型別,這時,不能確定我們呼叫的是哪個方法,會造成麻煩。另外,如果方法中的引數型別不同,則引數順序不同,也是過載...
C 過載與覆蓋的區別
過載 overload 是指編寫乙個與已知函式同名但是參數列不同的函式。過載主要屬於靜態編聯範疇,是在編譯期就完成位址的分配。普通成員函式的過載主要分成三部分 1 在乙個類中說明過載。如 show int a,char b 在編譯期經過編譯器修飾後函式名會變成int char show show c...
C 多型,過載與覆蓋的區別
父類有乙個虛函式,子類也有乙個同名函式,且這個同名函式擁有相同引數 包括引數型別,數量和順序 多型與類的繼承相關。父類有乙個非虛函式,子類也有乙個同名函式,且這個同名函式擁有相同引數 包括引數型別,數量和順序 覆蓋與類的繼承相關。子類中的覆蓋函式,通常會先呼叫父類中被覆蓋的函式,然後再新增自己特有的...