C++易混知識點5:實例講解Public Protected Private作用域,繼承的區別和用意

大學生涯,涉及到類的作用域,繼承都是用的public 共有繼承,當時也沒想那麼多,覺得共有繼承多方便,多簡單,反正沒有太多的限制,不管是類的成員或者是基類的成員函數都可以訪問。沒有深究。其實這裏面真是涉及到了C++面向對象設計當中的封裝特性。只暴露那些需要的成員和成員函數,不必過多曝露所有的成員。


轉載請註明出處:http://blog.csdn.net/elfprincexu

第一:private、public、protected訪問的範圍。

    private:只能由1、該類中的函數;2、其友元函數訪問。不能被其他任何訪問,該類對象也不能訪問。

private members are accessible in the class that defines them
    protected:可以被1、該類中的函數;2、子類的函數;3其友元函數訪問。該類對象不能訪問

protected memebers are accessible in the class that defines them and in classes that inherit from that class (at least protected inheritance). Instances of this class can not access them
    public
:可以被1、該類中的函數;2、子類的函數;3、其友元函數;4該類的對象訪問。

public memebers are accessible in the class that defines them, in classes that inherit from that class (at least protected inheritance), and also accessible by instances of the class that defines them.

    注:友元函數包括3中,設爲友元函數的普通非成員函數;設爲友元的其他類的成員函數;設爲友元類中的所有成員函數


第二:類的繼承後方法屬性的變化。

private屬性不能夠被繼承,對所有子類都是不可見的!
使用private繼承,父類的protected和public屬性在子類中變爲private;
使用protected繼承,父類的protected和public屬性在子類中變爲protected;
使用public繼承,父類的protected和public屬性不發生變化;

不多說,先來看看下面這個例子:

#include<iostream>
using namespace std;
//////////////////////////////////////////////////////////////////////////
class A       //父類
{
private:
    int privatedateA;
protected:
    int protecteddateA;
public:
    int publicdateA;
};
//////////////////////////////////////////////////////////////////////////
class B :public A      //基類A的派生類B(共有繼承)
{
public:
    void funct()
    {
        int b;
        b=privatedateA;   //error:基類中私有成員在派生類中是不可見的
        b=protecteddateA; //ok:基類的保護成員在派生類中爲保護成員
        b=publicdateA;    //ok:基類的公共成員在派生類中爲公共成員
    }
};
//////////////////////////////////////////////////////////////////////////
class C :private A  //基類A的派生類C(私有繼承)
{
public:
    void funct()
    {
        int c;
        c=privatedateA;    //error:基類中私有成員在派生類中是不可見的
        c=protecteddateA;  //ok:基類的保護成員在派生類中爲私有成員
        c=publicdateA;     //ok:基類的公共成員在派生類中爲私有成員
    }
};
//////////////////////////////////////////////////////////////////////////
class D :protected A   //基類A的派生類D(保護繼承)
{
public:
    void funct()
    {
        int d;
        d=privatedateA;   //error:基類中私有成員在派生類中是不可見的
        d=protecteddateA; //ok:基類的保護成員在派生類中爲保護成員
        d=publicdateA;    //ok:基類的公共成員在派生類中爲保護成員
    }
};
//////////////////////////////////////////////////////////////////////////
int main()
{
    int a;
 
    B objB;
    a=objB.privatedateA;   //error:基類中私有成員在派生類中是不可見的,對對象不可見
    a=objB.protecteddateA; //error:基類的保護成員在派生類中爲保護成員,對對象不可見
    a=objB.publicdateA;    //ok:基類的公共成員在派生類中爲公共成員,對對象可見
 
    C objC;
    a=objC.privatedateA;   //error:基類中私有成員在派生類中是不可見的,對對象不可見
    a=objC.protecteddateA; //error:基類的保護成員在派生類中爲私有成員,對對象不可見
    a=objC.publicdateA;    //error:基類的公共成員在派生類中爲私有成員,對對象不可見
 
    D objD;
    a=objD.privatedateA;   //error:基類中私有成員在派生類中是不可見的,對對象不可見
    a=objD.protecteddateA; //error:基類的保護成員在派生類中爲保護成員,對對象不可見
    a=objD.publicdateA;    //error:基類的公共成員在派生類中爲保護成員,對對象不可見
 
    return 0;
}


公有繼承(public)、私有繼承(private)、保護繼承(protected)是常用的三種繼承方式。
1. 公有繼承(public)
公有繼承的特點是基類的公有成員和保護成員作爲派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類的子類所訪問。
2. 私有繼承(private)
私有繼承的特點是基類的公有成員和保護成員都作爲派生類的私有成員,並且不能被這個派生類的子類所訪問。
3. 保護繼承(protected)
保護繼承的特點是基類的所有公有成員和保護成員都成爲派生類的保護成員,並且只能被它的派生類成員函數或友元訪問,基類的私有成員仍然是私有的。


下面列出三種不同的繼承方式的基類特性和派生類特性。

            public      protected       private

共有繼承      public      protected       不可見
私有繼承       private      private        不可見
保護繼承      protected    protected       不可見


在上圖中:

  1. 基類成員對派生類都是:共有和保護的成員是可見的,私有的的成員是不可見的。
  2. 基類成員對派生類的對象來說:要看基類的成員在派生類中變成了什麼類型的成員。如:私有繼承時,基類的共有成員和私有成員都變成了派生類中的私有成員,因此對於派生類中的對象來說基類的共有成員和私有成員就是不可見的。





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