C 知識點12 繼承和組合

2021-08-21 14:16:48 字數 2713 閱讀 1901

依據乙個或多個基類來定義乙個新的派生類(子類獲得父類特性)

程式易於建立和維和;重用**功能;提高執行時間(建立新類時不需要重新編寫新的資料成員和成員函式)

派生類可以訪問基類中所有的非私有成員,乙個派生類繼承了所有的基類方法,但下列情況除外:

基類的建構函式、析構函式和拷貝建構函式。

基類的過載運算子。

基類的友元函式

1.公有繼承public:基類的公有成員也是派生類的公有成員,基類的保護成員也是派生類的保護成員(保護成員用派生類的成員函式訪問)

2.保護繼承protected:基類的公有保護成員將成為派生類的保護成員

3.私有繼承private:基類的公有保護成員將成為派生類的私有成員

成員變數的宣告順序分布記憶體。

單繼承記憶體分布:

每個派生類複製乙份基類的成員變數。基類的資料放在派生類之前。派生類指標b和基類指標a指向同乙個位址。

多繼承記憶體分布:

派生類分別拷貝兩個基類的成員變數。基類a的指標和派生類c的指標指向同乙個位置,基類b的指標指向不同。(派生類和基類之間偏移量固定)

虛繼承記憶體分布:

由於派生類和虛基類之間偏移量不固定,所以需要在類中定義乙個虛基類表指標,儲存類中物件指標和虛基類表指標之間的偏移量。

虛基類表指標->指向偏移量表->偏移量表中儲存物件指標與虛基類表指標之間的偏移量

如圖所示,物件b的指標和虛基類表指標重合,所以虛基類表指標和物件b指標偏移量為0;

物件a指標和虛基類指標之間隔著乙個虛基類指標和派生類b的成員變數,因此偏移量為虛基類指標+派生類成員變數記憶體

class a;

class b:public

virtual a;

class c:public

virtual a;

class d:public b,public c;

其中class b:public virtual a

乙個子類可以有多個父類,它繼承了多個父類的特性

class

派生類名》:繼承方式1>基類名1>,繼承方式2>基類名2>,…

;

多繼承的優缺點:缺點:多重繼承情況下成員訪問的二義性

優點:重複利用

多個父類中有同名函式,如何確定子類覆蓋哪乙個父類的函式?使用形式「類名::函式名

類c繼承類a和類d,而類a和類d都繼承類b,因此在類c中存在兩份類b的拷貝。即浪費儲存空間;又存在二義性。虛繼承節省記憶體空間

b是虛基類,類a和類d對b虛繼承,類c多重繼承

class b;

class a:public

virtual b;

class d:public

virtual b;

class c:public a,public d;

};

在邏輯上a是b的一部分,則不允許b從a派生,而是要用a和其它東西組合出b

重用原類的內部實現即原類是新類的一部分用組合;

若需要原類的內部實現還要重用介面用繼承

p151**

知識點總結 組合,繼承,多型

一 組合 將乙個類的物件作為另乙個類的成員,被稱作組合或包含 1.將嵌入的物件作為新類的公有成員 class eye class nose class mouth class ear class head int main 2.將嵌入物件作為新類的私有成員 class engine void sta...

C 繼承相關知識點

c 作為物件導向的語言,類之間可以繼承,被繼承的類稱為基類 父類 產生的新類稱為派生類 子類 c 的類許可權分為三個等級,private 私有的 protect 被保護的 public 公有的 其相對應的繼承的許可權也分為相同的三個等級,即private,protect以及public繼承。這三類繼...

知識點 組合數

1.逆元求解組合數 目標 求出c n,m p 這裡p是乙個素數!方法 費馬小定理求逆元 因為膜的性質並不對除法適用,比如 a b c 但是,當我們知道了b c的逆元d時,問題可以轉化為 a d c a c b c c 考慮費馬小定理 a p 1 1 mod p 顯然有 a a p 2 1 mod p...