保護繼承和私有繼承

2021-07-31 12:35:09 字數 2426 閱讀 8729

-------------------siwuxie095

在 c++ 中有三種繼承方式:

關於公有繼承,詳見本人部落格的分類:c++遠征,

裡面的公有繼承

公有繼承:

1)基類中

public 下的成員將被繼承到派生類中 public 下

2)基類中

protected 下的成員將被繼承到派生類中 protected 下

3)基類中

private 下的成員將被繼承到派生類中不可見位置,但無法直接訪問,

沒有被繼承到派生類中 private 下

保護繼承:

1)基類中

public 下的成員將被繼承到派生類中 protected 下

2)基類中

protected 下的成員也將被繼承到派生類中 protected 下

3)基類中

private 下的成員將被繼承到派生類中不可見位置,但無法直接訪問

私有繼承:

1)基類中

public 下的成員將被繼承到派生類中 private 下

2)基類中

protected 下的成員也將被繼承到派生類中 private 下

3)基類中

private 下的成員將被繼承到派生類中不可見位置,但無法直接訪問

在這三種繼承關係中,以 私有繼承-private 最為特殊

為了說明這種特殊性,看如下例項:線段類與座標類的關係

在這種關係中,線段類只能訪問到座標類中的公有資料成員和公有成員 函式

而在私有繼承中,子類物件也只能訪問父類的公有資料成員和公有成員 函式

這兩者是很相似的,在 c++ 中把線段和座標的這種關係,稱之為

has-a,

即 線段中有乙個座標,這種關係是一種包含關係,在私有繼承中也是一種

包含關係,當定義乙個子類物件時,子類物件中就包含了乙個父類的物件。

因為它只能訪問父類中公有的資料成員和成員函式,所以,從本質上來說,

私有繼承也是一種

has-a的關係

程式:

person.h:

#include

using namespacestd;

classperson ;

person.cpp:

#include"person.h"

#include

using namespacestd;

person::person()

voidperson::play()

soldier.h:

#include"person.h"

classsoldier:protectedperson//

繼承方式換為

private

後就不一樣了;

soldier.cpp:

#include"soldier.h"

#include

using namespacestd;

soldier::soldier()

voidsoldier::work()

infantry.h:

#include"soldier.h"

classinfantry:publicsoldier ;

infantry.cpp:

#include"infantry.h"

#include

using namespacestd;

voidinfantry::attack()

main.cpp:

#include

#include"infantry.h"

using namespacestd;

intmain(void) //

主要體會

soldier.h

處的繼承方式

protected

和private

【made by siwuxie095】

C (私有繼承和保護繼承)

私有繼承和保護繼承 私有繼承 繼承的訪問控制 基類的public和prorected成員 都以private身份出現在派生類中 基類的private成員 不可直接訪問 訪問許可權 派生類中的成員函式 可以直接訪問基類中的public和protected成員,但不能訪問 基類的private成員 通過...

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

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

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

三種訪問許可權 public 可以被任意實體訪問 protected 只允許子類及本類的成員函式訪問 private 只允許本類的成員函式訪問 友元函式可以訪問這三種訪問許可權的成員 三種繼承方式 public 繼承 protect 繼承 private 繼承 組合結果 基類中 繼承方式 子類中 p...