-------------------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...