在物件導向的開發過程中,經常出現類的繼承,這裡面出現的成員函式的過載(overload)、覆蓋(override)與隱藏(hidden)很容易混淆。
首先澄清這3個概念
1. 過載
1)發生在同類中;
2)函式名相同;
3)引數不同;
4)可加可不加virtural關鍵字
2. 重寫(覆蓋)
1)發生在父類與子類中;
2)函式名相同;
3)引數相同;
4)必須加virtural關鍵字
3. 隱藏
1)派生類的函式與基類的函式同名,但不同參。此時,無論基類是否有無virtural關鍵字,基類的函式將被隱藏;(與過載不同的是:過載發生在同類中)
2)派生類的函式與基類的函式同名,且引數相同,但基類中無virtural關鍵字。此時,基類的函式被隱藏(與重寫不同的是:重寫必須加virtural關鍵字)
下面將通過**來說明:
#include
using
namespace std;
class
person
voidg(
float x)
voidh(
float x)};
class
teacher
:public person
voidg(
int x)
voidh(
float x)};
intmain()
結果輸出:
teacher::vf(float) 3.14
teacher::vf(float) 3.14
person::g(float) 3.14
teacher::g(int) 3
person::h(float) 3.14
teacher::h(float) 3.14
分析:
由於vf函式是virtual函式,呼叫它的物件型別為動態型別即指標指向的型別(動態聯編),所以呼叫的是子類的型別;
由於h函式和g函式是非virtual函式,呼叫它的物件型別為靜態型別即父類(靜態聯編),所以呼叫的是父類的物件
總結:if 子類的函式與父類的名稱相同,但是引數不同
父類函式被隱藏
else if 子類函式與父類函式的名稱相同&&引數也相同&&但是父類函式沒有virtual
父類函式被隱藏
else if 子類函式與父類函式的名稱相同&&引數也相同&&但是父類函式有virtual
父類函式被覆蓋(重寫)
對C 名字隱藏的理解
overwrite 重寫 是指派生類的函式遮蔽了與其同名的基類函式,規則如下 1 如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字,基類的函式將被隱藏 注意別與過載混淆 如何理解這句呢?看這個例子 class firstclass void firstclass m...
理解C 中過載 重寫和隱藏
為了後面說過載,這裡就先說隱藏吧 隱藏 函式和被隱藏函式在不同類,暫且為父類和子類吧,只要子類出現和父類同名的函式 只需要名字相同 則父類中該函式在子類中被隱藏,也即不可訪問,除非是用於替換被宣告為需要父類引數的地方 即子類此刻被隱式或顯示轉換為父類,可想想黎克特制代換這個東西 過載 過載函式和被過...
C 隱藏規則
在物件導向的開發過程中,經常出現類的繼承,這裡面出現的成員函式的過載 overload 覆蓋 override 與隱藏 hidden 很容易混淆。首先澄清這3個概念 過載相同的範圍 在同乙個類中 函式名字相同 引數不同 virtual 關鍵字可有可無 覆蓋 派生類函式覆蓋基類函式 不同的範圍 分別位...