繼承定義 繼承是使代碼可以復用的重要手段,也是面向對象程式設計的核心思想之一。 繼承就是不修改原有的類,直接利用原來的類的屬性和方法併進行擴展。原來的類稱為基類,繼承的類稱為派生類,他們的關係就像父子一樣,所以又叫父類和子類。 一般格式如下: 派生類成員可以訪問基類的 public成員 和 prot ...
繼承定義
繼承是使代碼可以復用的重要手段,也是面向對象程式設計的核心思想之一。
繼承就是不修改原有的類,直接利用原來的類的屬性和方法併進行擴展。原來的類稱為基類,繼承的類稱為派生類,他們的關係就像父子一樣,所以又叫父類和子類。
一般格式如下:
class 派生類名 : 繼承類型 基類名
派生類成員可以訪問基類的public成員和protected成員。
三種繼承方式
繼承類型有三種,共有繼承(public),私有繼承(private)和保護繼承(protected)。
共有繼承:
共有繼承的特點是基類成員在派生類中都保持原來的狀態
- 基類中的public仍為public,
- 基類中的protected仍為protected,
- 基類中的private仍為private;
私有繼承:
私有繼承的特點是基類中所有成員在派生類中都變為私有成員
- 基類中的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的。