過載(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中多個同名方法,其引數的個數和型別不同。如果引數的個數和型別相同但是返回值型別不同,則不構成過載,反證 我們有時候呼叫方法的時候,不關注返回值型別,這時,不能確定我們呼叫的是哪個方法,會造成麻煩。另外,如果方法中的引數型別不同,則引數順序不同,也是過載...
過載與覆蓋的區別
最近一直在刷面試題,遇到 過載與覆蓋的區別 於是記錄一波。方法的覆蓋是子類和父類之間的關係,是垂直關係 方法的過載是同乙個類中方法之間的關係,是水平關係。覆蓋只能由乙個方法,或只能由一對方法產生關係 方法的過載是多個方法之間的關係。覆蓋要求引數列表相同 過載要求引數列表不同。覆蓋關係中,呼叫那個方法...