首先,宣告一點,覆蓋和隱藏是基於繼承來討論的;至於過載貌似和繼承沒有太大聯絡,所謂過載就是同一函式名,不同的引數列表(型別或個數),這裡不做討論。
1 覆蓋
特點:(1)父類的成員函式是虛函式,即在成員函式前加上virtual關鍵字
(2)子類的同名成員函式和父類的完全相同,即引數和返回值型別完全一樣
滿足上述2條特徵即為覆蓋
目的: 其中乙個重要的作用就是通過父類訪問子類
例項分析
#include
class base
virtual void test()
;class child2 : public base
void test()
;int main()
; for(int i = 0; i < 3; i ++)
return 0;
}結果如下:
分析:base* d[3] = 這句**將b,c二種子類轉化為父類,由於覆蓋原則,父類中的test函式將被b,c子類的函式覆蓋,因此通過d[i]->test呼叫的是子類的建構函式,從而實現了通過父類訪問子類。
倘若沒有覆蓋,又是怎樣的結果?(本例是將base類中的成員函式的virtual關鍵字去掉),**如下:
#include
class base
void test()
;class child2 : public base
void test()
;int main()
;for(int i = 0; i < 3; i ++)
return 0;
}結果如下:
通過比較2者差別,應該了解到覆蓋的作用
2. 隱藏
隱藏是子類中的同名函式將父類中隱藏
特點:(1)父類和子類有同名函式
(2)同名函式不一樣(引數不一樣或者返回型別不一樣)
例項分析:
#include
class base
void test(int i)
;int main()
執行結果:
總結:由於隱藏,可能導致子類不能正常的訪問父類的成員函式,我們可以採取a.base::test(1)類似的方式解決
3 虛擬繼承
這次我們換一種策略講解
先看例項:
C 的過載 覆蓋 隱藏 繼承
函式過載 函式的繼承 這個不多說 子類繼承父類的公有變數 函式的覆蓋 也是重寫 關於子類修改了父類的成員函式 所以呼叫跟父類同名的成員函式 顯示的是子類的修改的函式的輸出方式 函式的隱藏 在父類和子類都有同名函式時,可以是顯示父類的函式輸出方式 也可以是顯示子類的輸出方式 但兩者會顯示的原因不同,如...
C 繼承之 過載 覆蓋 隱藏
在c 繼承中經常會遇到函式過載 覆蓋 隱藏這三個玩意,但是這三者的本質區別又是什麼,自己在網上和資料里查後並通過 證實,下面我們看看者三者的本質 1 過載 過載是c 獨有的乙個特性,c下面是沒有的,具體分析請看 這裡我們來具體看看過載,過載特點 1 在同一範圍 2 函式名相同 3 引數不同 4 返回...
C 繼承 同名隱藏 覆蓋,虛函式
不同作用域宣告的識別符號的可見性原則 如果存在兩個或多個具有包含關係的作用域,外層宣告了乙個識別符號,而內層沒有再次宣告同名識別符號,那麼外層識別符號在內層依然可見,如果在內層宣告了同名識別符號,則外層識別符號在內層不可見,這時稱內層識別符號隱藏了外層同名識別符號,這種現象稱為隱藏規則。在類的派生層...