C 中公有繼承 保護繼承 私有繼承

2021-07-05 22:02:48 字數 3382 閱讀 5086

公有繼承時基類中各成員屬性保持不變,基類中private成員被隱藏。派生類的成員只能訪問基類中的public/protected成員,而不能訪問private成員;派生類的物件只能訪問基類中的public成員。

私有繼承時基類中各成員屬性均變為private,並且基類中private成員被隱藏。派生類的成員也只能訪問基類中的public/protected成員,而不能訪問private成員;派生類的物件不能訪問基類中的任何的成員。

保護繼承時基類中各成員屬性均變為protected,並且基類中private成員被隱藏。派生類的成員只能訪問基類中的public/protected成員,而不能訪問private成員;派生類的物件不能訪問基類中的任何的成員。

//

公有繼承 物件訪問 成員訪問

public --> public

y y

protected --> protected

n y

private --> private

n n

//保護繼承 物件訪問 成員訪問

public --> protected

n y

protected --> protected

n y

private --> protected

n n

//私有繼承 物件訪問 成員訪問

public --> private

n y

protected --> private

n y

private --> private n n

**:
公有繼承(public)、私有繼承(private)、保護繼承(protected)是常用的三種繼承方式。

1. 公有繼承(public)

公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類的子類所訪問。

2. 私有繼承(private)

私有繼承的特點是基類的公有成員和保護成員都作為派生類的私有成員,並且不能被這個派生類的子類所訪問。

3. 保護繼承(protected)

保護繼承的特點是基類的所有公有成員和保護成員都成為派生類的保護成員,並且只能被它的派生類成員函式或友元訪問,基類的私有成員仍然是私有的。

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

public

protected

private

共有繼承

public

protected

不可見私有繼承

private

private

不可見保護繼承

protected

protected

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

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

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

對於公有繼承方式

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

公有成員可見,其他不可見。這裡保護成員同於私有成員。

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

公有成員和保護成員可見,而私有成員不可見。這裡保護成員同於公有成員。

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

公有成員可見,其他成員不可見。

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

對於私有繼承方式

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

公有成員可見,其他成員不可見。

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

公有成員和保護成員是可見的,而私有成員是不可見的。

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

所有成員都是不可見的。

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

對於保護繼承方式

這種繼承方式與私有繼承方式的情況相同。兩者的區別僅在於對派生類的成員而言,對基類成員有不同的可見性。

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

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

看看這樣的例子:

#include

usingnamespacestd;

//

classa//父類

;

//

classb :publica//基類a的派生類b(共有繼承)

};

//

classc :privatea//基類a的派生類c(私有繼承)

};

//

classd :protecteda//基類a的派生類d(保護繼承)

};

//

intmain()

**:

C 公有繼承,保護繼承,私有繼承

1.公有繼承 public 公有繼承時,對基類的公有成員和保護成員的訪問屬性不變,派生類的新增成員可以訪問基類的公有成員和保護成員,但是訪問不了基類的私有成員。派生類的物件只能訪問派生類的公有成員 包括繼承的公有成員 訪問不了保護成員和私有成員。include using namespace std...

C 公有繼承 私有繼承 保護繼承

公有繼承 public 私有繼承 private 保護繼承 protected 是常用的三種繼承方式。1.公有繼承 public 基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類的子類所訪問。2.私有繼承 private 基類的公有成員...

公有繼承 私有繼承 保護繼承

1.公有繼承 基類成員對派生類的可見性對派生類而言,基類的公有成員和保護成員可見,他們作為派生類的成員時,保持原有的狀態。基類的私有成員不可見,派生類不可訪問基類中的私有成員。基類成員對派生類物件的可見性對派生類物件而言,基類的公有成員是可見的,其他成員不可見。所以,在公有繼承時,派生類的物件可以訪...