C 繼承方式

2021-07-30 09:54:28 字數 3095 閱讀 8932

class 派生類名:[繼承方式] 基類名;
繼承方式限定了基類成員在派生類中的訪問許可權,包括 public(公有的)、private(私有的)和 protected(受保護的)。此項是可選項,如果不寫,預設為 private(成員變數和成員函式預設也是 private)。

類成員的訪問許可權由高到低依次為 public –> protected –> private,public成員可以通過物件及派生類來訪問,private 成員不能通過物件訪問。protected 成員和 private 成員類似,也不能通過物件訪問。但是當存在繼承關係時:基類中的 protected 成員可以在派生類中使用,而基類中的 private 成員不能在派生類中使用。不同的繼承方式會影響基類成員在派生類中的訪問許可權。

不同的繼承方式,基類不同型別成員在派生類中的屬性彙總如下:

繼承方式/基類成員

public成員

protected成員

private成員

public繼承

public

protected

不可見protected繼承

protected

protected

不可見private繼承

private

private

不可見

在上圖中:1)基類成員對派生類都是:公有和保護的成員是可見的,私有的的成員是不可見的。

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

為了進一步理解三種不同的繼承方式在其成員的可見性方面的區別,下面從三種不同角度進行討論。

對於公有繼承方式

(1) 基類成員對其物件的可見性:

(2) 基類成員對派生類的可見性:

(3) 基類成員對派生類物件的可見性:

所以,在公有繼承時,派生類的物件可以訪問基類中的公有成員;派生類的成員函式可以訪問基類中的公有成員和保護成員。這裡,一定要區分清楚派生類的物件和派生類中的成員函式對基類的訪問是不同的。

對於私有繼承方式

(1) 基類成員對其物件的可見性:

(2) 基類成員對派生類的可見性:

(3) 基類成員對派生類物件的可見性:

所以,在私有繼承時,基類的成員只能由直接派生類訪問,而無法再往下繼承。

對於保護繼承方式

(1) 基類成員對其物件的可見性:

(2) 基類成員對派生類的可見性:

(3) 基類成員對派生類物件的可見性:

上述所說的可見性也就是可訪問性。

關於可訪問性還有另的一種說法。這種規則中,稱派生類的物件對基類訪問為水平訪問,稱派生類的派生類對基類的訪問為垂直訪問。

分析發現

1) 不管繼承方式如何,基類中的 private 成員在派生類中始終不能使用(不能在派生類的成員函式中訪問或呼叫)。

2) 如果希望基類的成員能夠被派生類繼承並且毫無障礙地使用(在派生類的成員函式中訪問或呼叫),那麼這些成員只能宣告為 public 或 protected;只有那些不希望在派生類中使用的成員才宣告為 private。

3) 如果希望基類的成員既不向外暴露(不能通過物件訪問),還能在派生類中使用,那麼只能宣告為 protected。

注意

我們這裡說的是基類的 private 成員不能在派生類中使用,並沒有說基類的 private 成員不能被繼承。實際上,基類的private 成員是能夠被繼承的,並且(成員變數)會占用派生類物件的記憶體,它只是在派生類中不可見,導致無法使用罷了。private成員的這種特性,能夠很好的對派生類隱藏基類的實現,以體現物件導向的封裝性。

#include 

class base

int a;

protected:

int b;

private:

int c;

};

class derived1 : public

base

};

class derived2 : protected

base

};

class derived3 : private

base

};

class derived4 : public derived3

};

class derived5 : base

};

int main(void)

在派生類中訪問基類 private 成員的唯一方法就是借助基類的非 private 成員函式,如果基類沒有非 private 成員函式,那麼該成員在派生類中將無法訪問(除非使用下面講到的 using 關鍵字)。

在private或者protected繼承時,基類成員的訪問級別在派生類中更受限:

class base 

protected:

std::size_t n;

};class derived : private base ;

在這一繼承層次中,成員函式 size 在 base 中為 public,但在 derived 中為 private。為了使 size 在 derived 中成為 public,可以在 derived 的 public部分增加乙個 using 宣告。如下這樣改變 derived 的定義,可以使 size 成員能夠被使用者訪問,並使 n 能夠被 derived的派生類訪問:

class derived : private base ;

C 繼承方式

簡單地說下c 類的3種繼承方式,分別是public繼承,protected繼承,private繼承。最常用的還是public繼承。class預設的是private繼承,它的member如果沒寫許可權也是預設 private。struct則相反,預設的是public繼承。結合下面的圖示和 對c 的繼承...

C 繼承方式

公共繼承保護繼承私有繼承 class b public a 公有繼承的特點是 基類public 為派生類的public 基類protected 為派生類的protected 基類private 不能被派生類訪問 class b protected a 保護繼承的特點是 基類public 為派生類的p...

C 繼承方式

1.public 1 基類的public成員,在派生類中成員public成員 2 基類的protected成員,在派生類中成員protected成員 3 基類的private成員,在派生類中成員不可直接使用的成員 2.protected 1 基類的public成員,在派生類中成員protected成...