過載分為普通函式過載、運算子過載和型別過載,在這裡我們只介紹普通函式過載,包括全域性作用域下的函式過載和類作用域下的函式過載。
(1)函式名相同
(2)引數列表相同(包括引數個數、引數型別和引數順序)
(3)屬於同一作用域(必須是在同乙個類中的成員函式或者均為全域性函式,即基類和派生類中的同名函式不可能構成過載)
(1)函式名相同
(2)發生在基類和派生類之間(這裡的基類可能不是直接基類)
(3)基類的成員函式必須定義為虛函式(必須用virtual修飾),派生類中的成員函式可以不用virtual修飾(因為會自動從基類繼承virtual特性)
(1)函式名相同
(2)發生在基類和派生類之間
(3)基類中的成員函式沒有被virtual修飾,此時不管派生類中的成員函式是否與基類成員函式列表相同,兩者都構成隱藏關係
(4)基類的中成員函式被virtual修飾,但是此時派生類中的成員函式和基類成員函式列表不同,兩者構成隱藏關係
下面以乙個具體的例子來對以上三者進行說明:
class base
virtual
int memfun() //1
protected:
int mem;
};class derive1 :public base
int memfun(int a) //2
virtual
void f2() //3
protected:
int mem;
};class derive2 :public derive1
int memfun(int a) //5
void f2() //6
};
這個例子比較複雜,我們先來梳理一下各個類的記憶體布局情況:
(1).1和2構成隱藏關係,2隱藏1.即通過derive1的物件無法呼叫無引數的memfun函式。
(2).1和4構成覆蓋關係,因為類derive2的間接基類為base,且derive2中的memfun()函式和base的memfun()函式滿足上面所說的構成覆蓋關係的特點。
(3).1和5構成隱藏關係,5將1隱藏了。即通過derive2的物件無法呼叫無引數的memfun函式
(4).2和4、2和5均構成隱藏關係
(5).4和5構成過載關係
(6).3和6構成覆蓋關係
下面根據上面類的定義,說明一下如何呼叫以上函式:
int main(void)
C 中,過載 覆蓋和隱藏的區別?
函式的過載是指在c 的某乙個類中允許有多個同名的成員函式存在,但是同名的各個函式的形參必須有區別 a.形參的個數不同 b.形參的個數相同,但是形參的型別不同。覆蓋 override 是指在派生類中存在重新定義的函式,其函式名 引數列 返回值型別必須同基類 父類 中的相對應被覆蓋的函式嚴格一致,覆蓋函...
C 中過載 覆蓋 隱藏的區別
過載 過載特性 1 相同的範圍 2 函式名字相同 3 引數不同 4 virtual關鍵字可有可無 class a public void func int a,int b void func int a 這就是對函式進行了過載。注 對於全域性函式也是可以過載的,第乙個條件中只要範圍相同就可以。覆蓋 ...
C 過載 覆蓋和隱藏的區別
1 過載 覆蓋和隱藏的概念 覆蓋 覆蓋指的是派生類的虛函式覆蓋了基類的同名且引數相同的函式。過載 必須在乙個域中,函式名稱相同但是函式引數不同,過載的作用就是同乙個函式有不同的行為,因此不是在乙個域中的函式是無法構成過載的,這是過載的重要特徵。隱藏 是派生類的成員函式隱藏了基類函式的成員函式,在呼叫...