c 繼承中的覆蓋,隱藏,虛擬繼承

2021-06-13 17:29:39 字數 1603 閱讀 2712

首先,宣告一點,覆蓋和隱藏是基於繼承來討論的;至於過載貌似和繼承沒有太大聯絡,所謂過載就是同一函式名,不同的引數列表(型別或個數),這裡不做討論。

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 繼承 同名隱藏 覆蓋,虛函式

不同作用域宣告的識別符號的可見性原則 如果存在兩個或多個具有包含關係的作用域,外層宣告了乙個識別符號,而內層沒有再次宣告同名識別符號,那麼外層識別符號在內層依然可見,如果在內層宣告了同名識別符號,則外層識別符號在內層不可見,這時稱內層識別符號隱藏了外層同名識別符號,這種現象稱為隱藏規則。在類的派生層...