覆蓋,隱藏,過載

2021-04-29 02:15:49 字數 1764 閱讀 4830

1. 過載、覆蓋與隱藏

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

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

b.函式的名字相同

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

d.virtual關鍵字可有可無

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

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

b.函式名字相同

c.引數相同

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

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

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

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

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

#include

using std::cout;

using std::endl;

class base

void g(float x)

void h(float x);

class derived : public base

void g(int x)

void h(float x)

};void main(void)

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關鍵字宣告。除非在特殊情況下,比如需要檢查指標型別的時候。

#include

using std::cout;

using std::endl;

class base

};class derived : public base

};void main(void)

過載 覆蓋 隱藏

學習c 些許時間了,隨便寫點東西吧。過載 覆蓋 隱藏 1.過載 相同作用域,函式名相同,引數不同,virtual關鍵字可有可無。2.覆蓋 不同作用域,函式名相同,引數相同,有virtual關鍵字。3.隱藏 一般是父類和子類之間,函式名相同,引數不同時,不管有沒有virtual關鍵字都會導致隱藏。函式...

覆蓋,過載,隱藏

覆蓋 重寫 過載,隱藏這三者的概念很容易混淆,弄清楚這三者的區別與聯絡是有必要的.覆蓋 重寫 override,過載 overload,多型 polymorphis函式名字相同 引數不相同 引數個數或引數型別不同 相同作用域 virtual關鍵是可有可無 函式名字相同 引數相同 引數個數和引數型別都...

過載,覆蓋,隱藏

過載產生於乙個類,實現不同定義,統一介面。覆蓋產生與多個類,實現多型概念。隱藏多產生於繼承或者派生,屬於命名空間作用域範疇。當乙個類呼叫存在多重繼承時,呼叫函式和變數時 首先訪問自己的作用域,在自己作用域不存在,訪問父類,還不存在繼續向上查詢,直到全域性命名空間 注意命名空間指名稱,不包括引數,返回...