依據乙個或多個基類來定義乙個新的派生類(子類獲得父類特性)
程式易於建立和維和;重用**功能;提高執行時間(建立新類時不需要重新編寫新的資料成員和成員函式)
派生類可以訪問基類中所有的非私有成員,乙個派生類繼承了所有的基類方法,但下列情況除外:
基類的建構函式、析構函式和拷貝建構函式。
基類的過載運算子。
基類的友元函式
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...