c++繼承類這一部分雖然不是很難,但是也很重要,在這一塊我自己做了一些總結,下面跟大家交流一下。
首先簡單介紹一下繼承的概念:繼承(inheritance)是物件導向程式設計使**可以復用的最重要的手段,它允許程式設計師在保持原有類特性的基礎上進行擴充套件,增加功能。這樣產生新的類,稱派生類。
繼承關係有三種:public(公有繼承) ,protected(保護繼承),private(私有繼承),他們與成員訪問限定符不同,不能將二者混為一談,具體表示的含義與位置有關。不管是哪種繼承方式,在派生類內部都可以訪問基類的公有成員和保護成員,基類的私有成員存在但是在子類中不可見(不能訪問)。
class繼承中預設的繼承許可權為private而struct中預設的繼承許可權預設為public。
基類的private成員在派生類中是不能被訪問的,如果基類成員不想在類外直接被訪問,但需要在派生類中能訪問,就定義為protected。可以看出保護成員限定符是因繼承才出現的。下面給出一段**:
#include
using namespace std;
class base
; class derived:protected base//若改為private則在d類funtest函式中所有成員都不能被訪問,通過再建立乙個類這可判斷派生類到底是private還是protected
};
class d:public derived //這裡繼承關係必須為public
};
在繼承中還有個概念也很重要就是同名隱藏。同名隱藏:基類和派生類中成員同名優先訪問派生類,派生類成員將遮蔽基類對成員的直接訪問。在子類成員函式中,可以使用 基類::基類成員 訪問。
函式同成員一樣也有同名隱藏,如果兩個函式同名也呼叫派生類的函式而與函式有無引數無關。
base中:void funtest(int)
derived中:void funtest()
呼叫這兩個函式時即使傳參還是會呼叫derived中的funtest。
在繼承關係中,派生類中若沒有顯示定義六個預設成員函式則編譯系統會預設合成。
[cpp] view plain copy 在code上檢視**片派生到我的**片
執行結果顯示:建構函式體執行次序為:先調基類建構函式--->再調派生類建構函式。
但呼叫順序實則應為:先調派生類建構函式再在初始化列表中呼叫基類建構函式。
析構順序與執行結果相同為:先調派生類再調基類。
幾點說明:
1、基類沒有預設建構函式,派生類必須要在初始化列表中顯式給出基類名和引數列表。
2、基類沒有定義建構函式,則派生類也可以不用定義,全部使用預設建構函式。
3、基類定義了帶有形參表建構函式,派生類就一定定義建構函式。
4、基類建構函式給出,派生類沒有,編譯器會呼叫派生類預設建構函式。
5、必須在派生類初始化列表中調基類建構函式(因為只能建立一次,而在函式體中是賦值,賦值可以多次)
[cpp] view plain copy 在code上檢視**片派生到我的**片
class base
};
class derived:public base
private:
int _d;
};
int main()
繼承相容規則-----公有繼承
繼承相容規則-----公有繼承
繼承與友元:友元函式不是類的成員函式所以不能繼承。
繼承與靜態成員:基類定義了static成員,則整個繼承體系裡面只有乙個這樣的成員。無論派生出多少個子類,都只有乙個static成員例項。
單繼承&多繼承&菱形繼承
單繼承&多繼承&菱形繼承
b1& b1 = d;//底層相當於指標b1 = &d;
b2& b2 = d;//和上面相比形式上無區別,但底層處理不同(b2*)((int)&d+sizeof(b1))
b1& b1 = d;//底層相當於指標b1 = &d;
b2& b2 = d;//和上面相比形式上無區別,但底層處理不同(b2*)((int)&d+sizeof(b1))
class b
; class c1:public b
; class c2:public b
; class d:public c1,public c2
; int main()
因為上面這段**有問題,所以引出虛繼承,可以解決菱形繼承的二義性和資料冗餘的問題
所以應在c1,c2類的繼承許可權前加virtual 讓其變成虛擬繼承。
因為上面這段**有問題,所以引出虛繼承,可以解決菱形繼承的二義性和資料冗餘的問題
所以應在c1,c2類的繼承許可權前加virtual 讓其變成虛擬繼承。
class b
; class c1:virtual public b//注意是在c1和c2類加virtual
//而不能寫成class d:virtual public c1,virtual public c2
; class c2:virtual public b
; class d:public c1,public c2
; int main()
這段**的解釋和上面的圖中一樣。所以虛擬繼承解決菱形繼承的二義性就是使底層的基類成員只儲存了乙份,在訪問各個物件時使用虛表指標加上偏移量即可。
C 繼承小結
繼承是物件導向三大特性之一 繼承允許依據另乙個類來定義乙個類,這使得建立和維護乙個應用程式變得更容易。這樣做,也達到了重用 功能和提高執行效率的效果。繼承代表了 is a 關係。繼承的好處 可以減少重複的 class a public b a 類稱為子類或 派生類 b 類稱為父類或 基類 派生類中的...
c 中繼承問題小結
1.c 中繼承有公有繼承,保護繼承,私有繼承 定義個基類 include using namespace std class base public void display cout huang endl protected int x private int y 定義乙個派生類 公有繼承 派生類...
C 課程小結 繼承與派生
單繼承與多重繼承的區別 單繼承 乙個子類 派生類 只有乙個父類 只由乙個基類派生而成 多繼承 乙個子類 派生類 有多個父類 由多個基類派生而成 派生類的構成 1 從基類繼承過來的成員 包括資料成員和成員函式 2 在派生類裡面新增的成員 包括資料成員和成員函式 根據繼承方式的不同來調整從基類繼承過來成...