繼承 is a關係

2021-06-21 21:43:40 字數 1459 閱讀 8526

派生類和基類之間的特殊關係式基於c++繼承的底層模型的。實際上,c++有3個繼承方式:公用繼承、保護繼承和私有繼承。公有繼承是最常見的方式,他建立一種is-a關係,即派生類物件也是乙個基類物件,可以對基類物件執行的任何操作,也可以對派生類物件執行。例如,假設有乙個fruit類,可以不吃水果的重量和熱量。因為香蕉是一種特殊的水果,所以可以從fruit類派生出banana類。新類將繼承原始類的所有資料成員,因為,banana物件將包含表示香蕉重量和熱量的成員。新的banana類還新增了專門用於香蕉的成員,這些成員通常不用於水果,例如banana institute peelindex。因為派生類可以新增特性,所以,將這種關係稱為is-a-kind-of(是一種)關係可能更準確,但通常使用術語is-a。

為闡明is-a關係,來看一些該模型不符的例子。公用繼承不建立has-a關係。例如,午餐可能包含水果,但通常午餐並不是水果。所以,不能通過從fruit類派生出lunch類來在午餐中新增水果。在午餐中加入水果的正確方法是將其作為一種has-a關係:午餐有水果。

公用繼承不能建立is-like-a關係,也就是說,他不能採用明確。人們通常說律師就像鯊魚,但律師並不是鯊魚。例如,鯊魚可以在水下生活。所以,不能從shark類派生出lawyer類。繼承可以在基類的基礎上新增屬性,但不能刪除基類的屬性。在有些情況下,可以設計乙個包含共有特徵的類,然後以is-a或has-a關係,在這個類的基礎上對應相關的類。

共有繼承不建立is-implemented-as-a(作為.......來實現)關係。例如,可以使用陣列來實現棧,但從array類派生出stack類是不合適的,因為棧不是陣列。例如,陣列索引不是棧的屬性。另外,可以以其他方式實現棧,如鍊表。正確的方法是,通過讓棧包含乙個私有array物件成員來隱藏陣列實現。

公用繼承不建立uses-a關係。例如,計算機可以使用雷射印表機,但從computer類派生printer類(或反過來)是沒有意義的。然而,可以使用友元函式或來來處理printer物件和computer物件之間的通訊。

有時可能希望同乙個方法在派生類和基類的行為是不同的。換句話來說,方法的行為應取決於呼叫該方法的物件。這種較複雜的行為稱為多型——具有多種形態,即同乙個方法的行為隨上下文而異。有兩種重要的機制可用於實現多型公用繼承:

1)在派生類中重新定義基類的方法

2)使用虛方法。

繼承 is a關係

c 有3種繼承方式 公有繼承 保護繼承 私有繼承。公有繼承是最常用的方式,它建立一種is a關係,即派生類物件也是乙個基類物件,可以對基類物件執行的任何操作,也可以對派生類物件執行。如果希望同乙個方法在派生類和基類中的行為是不同的,也就是說,方法的行為應取決於呼叫該方法的物件。這種較複雜的行為成為多...

C primer 十六 繼承 is a關係

派生類和基類之間的特殊關素是基於c 繼承的底層模型的。實際上c 有3種繼承方式 公有繼承 保護繼承和私有繼承。公有繼承是最常用的方式,它建立一種is a關係,即派生類物件也是乙個基類物件,可以對基類物件執行的任何操作,也可以對派生類物件執行。例如,假設有乙個fruit類,可以保護水果重量和熱量。因為...

Is a 和Has a之間關係

is a 和has a之間關係 可以這樣理解 汽車是一種交通工具 汽車 is a 交通工具 汽車有乙個發動機 汽車 has a 發動機 is a 一般是繼承關係 has a 一般是組合關係 或者這樣理解 has a 關係即組合關係,通過定義類的屬性的方式實現的 is a 關係即繼承關係,通過類繼承實...