C 類成員函式的過載 覆蓋與隱藏

2021-05-02 09:27:30 字數 1384 閱讀 1342

1. 過載、覆蓋與隱藏

1).過載:成員函式具有以下的特徵時發生"過載"

a.相同的範圍(同乙個類中)

b.函式的名字相同

c.引數型別不同(不能進行隱式型別轉換)

d.virtual關鍵字可有可無

2).覆蓋(也叫"繼承"):指派生類函式覆蓋基類函式,特徵是:

a.不同的範圍(分別位於基類與派生類中)

b.函式名字相同

c.引數相同

d.基類函式必須有virtual關鍵字

3).隱藏:是指派生類的函式遮蔽了與其同名的基類函式,規則如下:

a.如果派生類的函式與基類的函式同名,但是引數不同,此時不論有無virtual關鍵字,基類的函式都將被隱藏,注意別與過載混淆)

b.如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關鍵字,此時基類的函式被隱藏(注意別與覆蓋混淆)

2.看下面這個例子**:

3. 解釋

在27與28行,派生類的derived::f(float x)通過virtual關鍵字繼承(覆蓋)了基類的base::f(float x)方法,所以這裡無論採有基類指標還是派生類指標,最後呼叫的其實都是derived::f(float x)方法。這正是一般情況我們所期望的。

在30行,由於基類的base::g()沒有用virtual關鍵字宣告,所以這裡它不會被派生類的derived::g()方法覆蓋。所以通過基類指標訪問時只能訪問到base::g(float x),而在31行通過派生類指標時可以訪問的方法有base::g(float x)和derived::g(int x),這兩個方法雖然方法名相同而且引數不同(似乎)符合過載的標準,但是它們卻分屬於不同的"域"因此過載不會發生,這時derived::g(int x)就只能把base::g(float x)"隱藏"掉。

同上,在第33行通過基類指標能訪問的方法只有base::h(float x),由於該方法沒有被virtual關鍵字宣告,所以不會被派生類方法derived::h(float x)"替換",因此呼叫的是base::h(float x)。而在第34行通過派生類指標可以訪問的方法同時有base::h(float x)與derived::h(float x),這似乎又衝突,而這時c++的"隱藏"規則發生作用,所以派生類方法derived::h(float x)把基類方法base::h(float x)"隱藏",於是derived::h(float x)被呼叫。

4.總結

c++的"過載"、"繼承"與"隱藏"機制比一般想象中的要複雜,而這就突顯了virtual關鍵字的重要性。所以在派生類存在的前提下一,一定要把基類中可能在派生類中也實現的方法用virtual關鍵字宣告。除非在特殊情況下,比如需要檢查指標型別的時候。

C 類成員函式的過載 覆蓋與隱藏

1.過載 覆蓋與隱藏 1 過載 成員函式具有以下的特徵時發生 過載 a 相同的範圍 同乙個類中 b 函式的名字相同 c 引數型別不同 不能進行隱式型別轉換 d virtual關鍵字可有可無 2 覆蓋 也叫 繼承 指派生類函式覆蓋基類函式,特徵是 a 不同的範圍 分別位於基類與派生類中 b 函式名字相...

類成員函式的過載 覆蓋與隱藏

基類和派生類類成員函式的過載 覆蓋 override 與隱藏很容易混淆,c 程式設計師必須要搞清楚概念,否則錯誤將防不勝防。1.過載與覆蓋 成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。覆蓋是指派生類函式覆蓋基類函式,特徵是 ...

C 成員函式的過載 覆蓋與隱藏

成員函式的過載 覆蓋 override 與隱藏很容易混淆,c 程式設計師必須要搞清楚概念,否則錯誤將防不勝防。成員函式被過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual 關鍵字可有可無。覆蓋 派生類函式覆蓋基類函式,特徵是 1 不同的範圍 分別位於派生類與...