c 中過載 隱藏和覆蓋的區別

2021-08-13 15:27:03 字數 1351 閱讀 6674

過載分為普通函式過載、運算子過載和型別過載,在這裡我們只介紹普通函式過載,包括全域性作用域下的函式過載和類作用域下的函式過載。

(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 過載 覆蓋和隱藏的概念 覆蓋 覆蓋指的是派生類的虛函式覆蓋了基類的同名且引數相同的函式。過載 必須在乙個域中,函式名稱相同但是函式引數不同,過載的作用就是同乙個函式有不同的行為,因此不是在乙個域中的函式是無法構成過載的,這是過載的重要特徵。隱藏 是派生類的成員函式隱藏了基類函式的成員函式,在呼叫...