c 隱藏理解

2021-09-11 23:33:41 字數 1357 閱讀 2816

在物件導向的開發過程中,經常出現類的繼承,這裡面出現的成員函式的過載(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 關鍵字可有可無 覆蓋 派生類函式覆蓋基類函式 不同的範圍 分別位...