C++繼承(一) 三種繼承方式

繼承定義

繼承是使代碼能夠複用的重要手段,也是面向對象程序設計的核心思想之一。設計

繼承就是不修改原有的類,直接利用原來的類的屬性和方法並進行擴展。原來的類稱爲基類,繼承的類稱爲派生類,他們的關係就像父子同樣,因此又叫父類和子類。code

通常格式以下:對象

class 派生類名 : 繼承類型 基類名

派生類成員能夠訪問基類的public成員protected成員繼承

三種繼承方式

繼承類型有三種,共有繼承(public)私有繼承(private)保護繼承(protected)接口

共有繼承:it

共有繼承的特色是基類成員在派生類中都保持原來的狀態table

  • 基類中的public仍爲public,
  • 基類中的protected仍爲protected,
  • 基類中的private仍爲private;

私有繼承:程序設計

私有繼承的特色是基類中全部成員在派生類中都變爲私有成員class

  • 基類中的public,protected變爲private,
  • 基類中的private仍爲private;

保護繼承:擴展

  • 基類中的public變爲protected,
  • 基類中的protected仍爲protected,
  • 基類中的private仍爲private;

private在派生類中依然存在,但不論以哪一種方法繼承基類,派生類都不能直接訪問基類的私有成員。

繼承方式 基類的public成員 基類的protected成員 基類的private成員
public繼承 public成員 protected成員 private成員
protected繼承 protected成員 protected成員 private成員
private繼承 private成員 private成員 private成員

for example:

class Base {    //基類 
    public :
        int pub;
    private:
        int pri;
    protected :
        int pro;
};

class A : public Base{  //public繼承 
    public :
        int a;
        void init() {
            a = pub;    //能夠,依然爲public成員 
            a = pro;    //能夠,依然爲protected成員 
            a = pri;    //錯誤,基類的私有成員在派生類中是不可見的 
        }
}; 

class B : protected Base{   //protected繼承 
    public :
        int b;
        void init() {
            b = pub;    //能夠,變爲protected成員 
            b = pro;    //能夠,依然爲protected成員 
            b = pri;    //錯誤,基類的私有成員在派生類中是不可見的 
        }
}; 

class C : private Base{ //private繼承 
    public :
        int c;
        void init() {
            c = pub;    //能夠,變爲private成員 
            c = pro;    //能夠,變爲private成員 
            c = pri;    //錯誤,基類的私有成員在派生類中是不可見的 
        }
}; 
int x;
    A a;
    x = a.pub;  //能夠,public繼承的public成員是public的,對對象可見 
    x = a.pro;  //錯誤,public繼承的protected成員是protected的,對對象不可見 
    x = a.pri;  //錯誤,public繼承的private成員是private的,對對象不可見
    
    B b;
    x = b.pub;  //錯誤,protected繼承的public成員是protected的,對對象不可見
    x = b.pro;  //錯誤,protected繼承的protected成員是protected的,對對象不可見
    x = b.pri;  //錯誤,protected繼承的private成員是private的,對對象不可見
    
    C c;
    x = c.pub;  //錯誤,protected繼承的public成員是private的,對對象不可見
    x = c.pro;  //錯誤,protected繼承的protected成員是private的,對對象不可見
    x = c.pri;  //錯誤,protected繼承的private成員是private的,對對象不可見
    return 0;
  • public繼承是一個接口繼承,保持is-a原則,每一個父類可用的成員對子類也可用,由於每一個子類對象也都是一個父類對象。
  • protetced/private繼承是一個實現繼承,基類的部分紅員並不是徹底成爲子類接口的一部分,是has-a的關係原則,因此非特殊狀況下不會使用這兩種繼承關係,在絕大多數的場景下使用的都是公有繼承。
  • class的默認繼承是private的,struct的默認繼承是public的。
相關文章
相關標籤/搜索