C 過載與覆蓋的區別

2021-07-07 01:12:43 字數 1245 閱讀 3033

過載(overload:是指編寫乙個與已知函式同名但是參數列不同的函式。過載主要屬於靜態編聯範疇,是在編譯期就完成位址的分配。

普通成員函式的過載主要分成三部分:

(1)在乙個類中說明過載。

如 show(int a,char b);//在編譯期經過編譯器修飾後函式名會變成int_char_show

show(char* c,double d);//在編譯期經過編譯器修飾後函式名會變成char_double_show

(2)在基類中宣告乙個函式,在子類中過載這個函式(未宣告virtual關鍵字)(還有一種說法是隱藏,但我認為可以簡單的認為是一種特殊的過載更確切,不考慮這個兩個函式具有相同的引數),經過編譯期之後,有三種編譯區分的方法:

1.根據引數特徵進行區分。

如  base: show(int ,int );

derived:  show(int ,float);

這兩個函式不是乙個函式,編譯器可以區分

2.根據「::」作用域符進行區分。編譯器進行編譯時,可根據不同的作用域進行區分過載函式。

如  base::show( );

derived::show( );

3.根據類物件進行區分呼叫哪乙個過載函式。

如  base b; b.show( );

derived d; d.show( );

由上可知,過載只是一種語言特性,與多型無關,與物件導向無關。

覆蓋(override):是指派生類重寫基類的虛函式,重寫的函式必須具有一致的參數列和返回值。覆蓋是一種動態編聯。在執行期進行確定所呼叫的函式位址。

覆蓋是與多型密切相關的一種機制,與物件導向有關。

以下通過乙個程式來說明過載與覆蓋:

#include

using namespace std;

class a

virtual int dogetdata()

int getdata()

private:

int m_data;

};class b:public a

int dogetdata()

private:

int m_data;

};class c:public b

private:

int m_data;

};int main(int argc, char* argv)

C 多型,過載與覆蓋的區別

父類有乙個虛函式,子類也有乙個同名函式,且這個同名函式擁有相同引數 包括引數型別,數量和順序 多型與類的繼承相關。父類有乙個非虛函式,子類也有乙個同名函式,且這個同名函式擁有相同引數 包括引數型別,數量和順序 覆蓋與類的繼承相關。子類中的覆蓋函式,通常會先呼叫父類中被覆蓋的函式,然後再新增自己特有的...

過載與覆蓋的區別

1.過載 overload 指的是乙個class中多個同名方法,其引數的個數和型別不同。如果引數的個數和型別相同但是返回值型別不同,則不構成過載,反證 我們有時候呼叫方法的時候,不關注返回值型別,這時,不能確定我們呼叫的是哪個方法,會造成麻煩。另外,如果方法中的引數型別不同,則引數順序不同,也是過載...

過載與覆蓋的區別

最近一直在刷面試題,遇到 過載與覆蓋的區別 於是記錄一波。方法的覆蓋是子類和父類之間的關係,是垂直關係 方法的過載是同乙個類中方法之間的關係,是水平關係。覆蓋只能由乙個方法,或只能由一對方法產生關係 方法的過載是多個方法之間的關係。覆蓋要求引數列表相同 過載要求引數列表不同。覆蓋關係中,呼叫那個方法...