c 中的過載,重寫,重定義

2021-07-22 07:05:39 字數 968 閱讀 8085

c++中的幾個容易混淆的概念:

(1)過載:在同一作用域中,函式名相同,引數列表不同,返回值可同可不同的函式。

關於函式過載的知識在《函式過載》這篇部落格中有詳細介紹。

(2)重寫:又叫覆蓋,是指不在同乙個作用域中(分別在父類和子類中),函式名, 參

數個數,引數型別,返回值型別都相同,並且父類函式必須有virtual關鍵字的函式, 就構

成了重寫(協變除外)。

協變:協變也是一種重寫,只是父類和子類中的函式的返回值不同,父類的函式返回父

類的指標或者引用,子類函式返回子類的指標或者引用。

下邊看個例子:

class b

virtual void show()

protected:

int _num;

};class d :public b

virtual void show()

protected:

int _num;

};int main()

這段程式中,show函式和_num成員都被重寫了,呼叫d的show函式列印2.sizeof(d)

的結果是12.沒錯,就是12.父類的show函式被子類的show函式覆蓋,_num只是被隱藏

了(下邊介紹),但是仍然存在,另

外記憶體中還會存在乙個虛函式表的指標,存放虛函

數的位址,通過檢視虛函式表可以發現,表中只會存放子類show函式的位址,說明父類

的show函式被覆蓋。如下圖:

(3)重定義:又叫隱藏,是指在不同的作用域中(分別在父類和子類中),函式名相

同,不能構成重寫的都是重定義(重定義的不光是函式,還可以是成員變數)。上例中

的_num成員就構成了重定義(子類中仍然存在),這裡就不再給出例項。

C 中過載 重寫 重定義

過載 1 作用域相同。2 函式名相同,引數列表不同。3 與返回值無關。例 同乙個類的建構函式和拷貝建構函式構成過載。class a a const a a 重寫 覆蓋 1 不在同一作用域 分別為基類和派生類 2 函式名相同,引數列表相同,返回值相同。3 基類成員函式必須有virtual關鍵字修飾。4...

C 過載重寫重定義

includeusing namespace std 函式過載 必須在同乙個類中進行 子類無法過載父類的函式,父類同名函式將被名稱覆蓋 過載是在編譯期間根據引數型別和個數決定函式呼叫 函式重寫 必須發生於父類和子類之間 並且父類和子類中的函式必須有完全相同的原型 使用virtual宣告之後能夠產生多...

C 過載 重寫 重定義

指函式名相同,但是它的參數列列個數或順序,型別不同。但是不能靠返回型別來判斷。1 相同的範圍 在同乙個作用域中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。5 返回值可以不同 是指派生類重新定義基類的虛函式,特徵是 1 不在同乙個作用域 分別位於派生類與基類 2 函式名字相同...