1.繼承概念
所謂繼承,就是在已有類上派生出新類(派生類或子類),保持原有類特性的基礎上進行擴充套件,增加新功能,被繼承的類叫做基類(或父類),產生的新類叫做派生類(或子類)。
2.繼承定義格式
class 派生類名稱:繼承型別(public,protected,private) 基類(父類)名稱
舉例:
class base
public:
int _a;
protected:
int _b;
private:
int _c;
};class derived :public base
public:
int _e;
protected:
int _f;
private:
int _g;
};
3.訪問限定符
總結:(1)公有繼承實現的是乙個介面繼承,基類可用的成員派生類也可用。
(2)保護繼承和私有繼承是乙個實現繼承,基類的部分成員並非完全成為派生類介面的一部分。絕大多數場景中使用的是公有繼承。
(3)基類的私有成員在派生類中不可訪問,保護繼承可以使得基類成員能在派生類內訪問,但不能在類外訪問
。由此可見,保護成員限定符是因繼承才出現的。
(4)三種繼承方式,都允許在派生類內部訪問基類公有成員和保護成員,基類的私有成員均不允許訪問,即不可見。
(5)關鍵字class預設的繼承方式是private,關鍵字struct預設的繼承方式是public,但是建議一般情況下將繼承方式給出來。
4.派生類的預設成員函式
繼承關係中建構函式的呼叫順序:
派生類物件--->派生類建構函式列表---
>基類建構函式--->派生類建構函式
繼承關係中析構函式的呼叫順序:
析構派生類物件---
>派生類析構函式列表--->基類析構函式---
>派生類析構函式
舉個例子:
class test1
~test1()
{}};
class test2
~test2()
{}};
class base1
~base1()
{}protected:
int _data;
};class base2
~base2()
{}protected:
int _data2;
};class derive : public base1, public base2
~derive()
{}protected:
test1 t1;
test2 t2;
};
構造函式呼叫順序:
1.derive(): base1(0), base2(1),t1(3), t2(4)
派生類derive建構函式列表--->基類base1建構函式--->基類base2建構函式--->派生類derive建構函式--->t1建構函式--->派生類derive建構函式--->t2建構函式--->派生類derive建構函式
2.derive(): base2(0), base1(1),t2(3), t1(4)
3.derive(): t1(3), t2(4), base1(0), base2(1)
4.derive() : t2(3), t1(4), base2(0), base1(1)
派生類derive建構函式列表--->基類base1建構函式--->派生類derive建構函式--->基類base2建構函式--->派生類derive建構函式--->t1建構函式--->派生類derive建構函式--->t2建構函式--->派生類derive建構函式
5.繼承體系中的作用域
(1)在繼承體系中,基類和派生類是在兩個不同的作用域。
(2)派生類和基類中有相同的成員或成員函式,派生類成員將遮蔽基類對成員的訪問,即同名隱藏。一般情況下,避免基類的成員和成員函式和派生類成員和成員函式相同。
6.賦值相容規則(public繼承)
(1)子類物件可以賦值給父類物件
(2)父類物件不可以賦值給子類物件
(3)父類的指標/引用可以指向子類物件
(4)子類的指標/引用不可以指向父類物件,但可以通過強制型別轉換
7.友元函式&繼承
友元關係不可以繼承,即基類友元不能訪問子類私有成員和保護成員。
8.靜態成員&繼承
基類中有乙個靜態成員,無論派生多少個子類,靜態成員都是唯一的,不會發生改變。
9.繼承方式
(1)單繼承
(2)多繼承
(3)菱形繼承
(4)虛繼承
解決二義性問題。
C 公有繼承 私有繼承 保護繼承的詳細區別
不同的繼承方式主要體現在以下兩個方面 派生類成員對於基類的訪問許可權 類內 通過派生類物件對基類成員的訪問許可權 類外 1 需要被外界 派生類物件 訪問的成員直接設定為public 2 只能在基類類中訪問的成員設定為private 3 只能在基類和子類中訪問的成員設定為protected,prote...
C 虛繼承 虛基類 多繼承 詳細解讀
首先要說一下多繼承,虛基類和虛繼承都是在多繼承的一種情況下存在的內容。多繼承是子類繼承自多個父類的繼承方式。但是在多繼承的過程中,存在這樣一種情況,乙個基類a分別被中間基類b c繼承,然後d又繼承了b c,此時就出現了問題 如果子類d使用父類b或者父類c獨有的成員變數,這時沒有問題。但是如果d使用的...
C 物件導向之繼承 超詳細
前言 繼承是物件導向程式設計的主要特徵之一,是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的資料或新的功能,也可以用已存在的類的功能。繼承是在類之間建立一種相交關係,使得新定義的派生類 子類 的例項可以繼承已有基類 父類 的特徵和能力,而且還可以加入新的特性或者修改已有的特性建立...