c 繼承之is a和hasas a

2021-08-22 07:17:30 字數 1749 閱讀 1239

舉乙個例子,有乙個horse類可以儲存關於馬的所有資訊,身高體重等等,那麼我們就可以從horse類中派生出白馬類,白馬類包含所有horse類的成員,在白馬類中可以新增關於白馬的成員,這個成員通常不用於horse類。

class horse

;class whitehorse:public horse

;

上面的**中,whitehorse多了顏色這個成員。

整體來看,is-a表示了一種是的關係。比如白馬是馬,香蕉是水果,老師是人這種關係。

並且public的繼承方式建立了is_a的關係。

派生類soldier繼承自基類person

class person

;class soldier : public person

;

int main()

int main()

同理,乙個士兵也是乙個人,父類的指標也可以指向子類物件。

+ 把基類的指標或者是基類的物件或者是基類的引用作為函式的引數來使它可以接收所傳入的子類的物件,並且也可以傳入基類的物件

「` void func1(person *p)

void func2(person &p)

int main()

+ 基類只能接收和訪問派生類中自己有的資料成員和成員函式

//#include 「person.h」

# include 「soldier.h」

int main()

如果需要呼叫子類的成員函式,那麼就是多型的內容了,後面再說。

這是在編譯期就決定了的。

+ 通過基類的指標指向派生類的物件

//#include 「person.h」

#include 「soldier.h」

int main()

log:

person::play()

james

person::~person()

「`has-a體現了有這個思想。

比如,午餐有香蕉。但是午餐不是香蕉。

其實私有跟保護繼承體現了has-a原則是因為,私有跟保護繼承是實現繼承。

什麼是實現繼承呢?

實現繼承的主要目標是**重用,我們發現類b和類c存在同樣的**,因此我們設計了乙個類 a,用於存放通用的**,基於這種思路的繼承稱為實現繼承。

我們可以說,午餐中存在香蕉。

而共有繼承則不是,為什麼?

在需要基類物件的任何地方都可以使用公有派生類的物件來替代。通過公有繼承,派生類得到了基類中除建構函式、析構函式之外的所有成員,而且所有成員的訪問控制屬性也和基類完全相同。這樣,公有派生類實際就具備了基類的所有功能,凡是基類能解決的問題,公有派生類都可以解決。

那麼就可得到,當為私有或保護繼承的時候,是包含的關係,基類在派生類中是私有的。需要基類的時候是不能用派生類代替的。

class

banana;

class

lauch

;

初學程式設計C 之isa

示例 include include using namespace std 保護繼承和私有繼承 要求 1 person類 資料成員 m strname 成員函式 建構函式 析構函式 play 2 solder類 資料成員 m iage 成員函式 建構函式 析構函式 work 3 定義函式test1...

C 之繼承和派生

什麼是繼承和派生?在我們寫程式的時候,比如需要寫兩個類 男人類,和女人類 但是在寫這兩個類的方法的時候有很多方法是相同的,比如吃飯類,喝水類,學習類。這樣的寫的話就做了重複的工作,增加了 寫程式和後期維護的成本。因此c 裡就有了繼承和派生的概念,意思就是根據男人類和女人類的共同特點,抽象出乙個人類。...

C 自學筆記 15)之隱藏與isA

隱藏就是當父類與子類定義相同的成員時,子類從父類繼承來的成員會隱藏掉,例項化時呼叫子類的成員。如上圖在定義兩個有繼承關係的類後,下圖中例項化後紅色語句第一行是呼叫子類的play,第二行是呼叫父類的play。1 如果是定義了同名的資料成員需要在子類的成員函式中呼叫時區分的話,如父類的string co...