[c++] public繼承、protected繼承、private繼承

前言:

public、protected、private 這三個權限修飾字既可以用來修飾成員變量和成員函數,也可以用來修飾繼承類型。下面將討論繼承類型。

 

成員變量和成員函數的訪問權限:

  • 派生類對基類成員的訪問權限,是public 、 protected 、 private繼承類型沒關係,僅僅與基類中成員的權限屬性有關係
  • 派生類能訪問基類的public和protected成員,不能訪問private成員。

 

繼承權限是用來控制 “派生類的使用者” 對基類成員的訪問權限:

這裏涉及到兩個概念:

  1. 派生類對基類成員的訪問權限
  2. 派生類使用者對基類成員的訪問權限

類成員的使用者有三種:

  1. 自己的其他成員,比如成員函數可以使用成員變量,不管成員變量是什麼權限,注意,這裏的使用僅限在這個類的實現中,通過類實例來訪問,這屬於類使用者的訪問,而不是類自身的訪問
  2. 派生類,派生類的實現(成員函數、成員變量)能夠訪問它基類的protected和public成員
  3. 派生類的派生類(孫類) 和 其他類,如果派生類是public繼承基類的,那麼這兩種類都可以“ 通過多態 ”直接訪問基類的public成員。如果是private的,那麼無論如何都不能 “ 通過多態 ”直接訪問基類的任何成員,包括public的,當然,你可以直接通過基類指針來訪問。

 

目前已知場景有兩個:

通過private繼承,來控制孫類對基類的成員訪問。
          
private繼承可以理解爲:可傳家產(public)到兒子輩就被截住了,孫子輩用不到爺爺輩的東西。
public繼承可以理解爲:可傳家產(public)兒子輩一點沒動,孫子輩可以接這用爺爺輩的東西。

即:哪一層繼承做了private限制,對上一層的訪問就在哪一層停止,後續的繼承都沒法突破這層限制。

每一層只能控制自己下一層對自己上一層的訪問,而自己永遠都能夠訪問上一層的public東西。

通過private繼承,來控制類使用者通過基類指針指向派生類。

例:
    class A{
        ...
    }
    class B:private A{
            ...
    }
    main{
        A* pa;
        B b;
        pa = &b;    //如果是private繼承,則詞句編譯不過,public繼承就可以
            //因爲這裏是main函數這麼一個類使用者試圖通過派生類指針來訪問基類成員
            //同理,如果這裏不是main函數,而是類外一個類C,同樣也允許,因爲他們
            //對於 A  和 B來說都是使用者。
    }
 

 

小結:

1)成員變量的權限,是用來控制  子類  和  使用者對自己成員的訪問。
2)繼承權限,是用來控制  自己的子類  對 自己的父類 的 “”“”public”““”成員的訪問,注意這裏說的是public成員,因爲無論如何都無法訪問private成員。

 

可以簡單理解爲:
“  使用哪種繼承,就會把基類的public成員變成自己的 哪種成員  ,而 類使用者 和 繼承自己的 的類只需要依舊按照成員訪問權限來訪問自己即可 ”

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章