第五週:繼承
繼承和派生的基本概念
繼承:在定義一個新的類B時,如果該類與某個個已有的類A相似(指的是B擁有A的全部特點),那麼就可以把A作爲一個基類,而把B作爲基類的一個派生類(也稱子類)。
派生類是通過對基類進行修改和擴充得到的。在派生類中,可以擴充新的成員變量和成員函數。
派生類一經定義後,可以獨立使用,不依賴於基類。
派生類擁有基類的全部成員函數和成員變量,不論是private、prtected、public。
注意:在派生類的各個成員函數中,不能訪問基類中的private成員。
派生類的寫法
class 派生類名: public 基類名 { };
關於繼承派生形式可以爲private和protected,詳見:C++ private和protected派生(私有和保護派生)
派生類對象的體積
等於基類對象的體積,再加上派生類對象自己的成員變量的體積。在派生類對象中,包含着基類對象,而且基類對象的存儲位置位於派生類對象新增的成員變量之前。
繼承關係和複合關係
繼承:“是”的關係。
基類A,B是基類A的派生類。
邏輯上要求:“一個B對象也是一個A對象”。
複合:“有”關係。
類C中“有”成員變量k,k是類D的對象,則C和D是複合關係
一般邏輯上要求:“D對象是C對象的固有屬性或組成部分”。
覆蓋和保護成員
覆蓋
派生類可以定義一個和基類成員同名的成員,這叫覆蓋。在派生類中訪問這類成員時,缺省的情況是訪問派生類中定義的成員。要在派生類中訪問由基類定義的同名成員時,要使用作用域符號::。
(注意儘量不要再派生類定義同名的成員變量)
類的保護成員
基類的private成員:可以被下列函數訪問
1.基類的成員函數
2.基類的友員函數
基類的public成員:可以被下列函數訪問
1.基類的成員函數
2.基類的友員函數
3.派生類的成員函數
4.派生類的友員函數
5.其他的函數
基類的protected成員:可以被下列函數訪問
1.基類的成員函數
2.基類的友員函數
3.派生類的成員函數可以訪問當前對象的基類的保護成員
派生類的構造函數
在創建派生類的對象時,需要調用基類的構造函數:初始化派生類對象中從基類繼承的成員。在執行一個派生類的構造函數之前,總是先執行基類的構造函數。
派生類的析構函數被執行時,執行完派生類的析構函數後,自動調用基類的析構函數。
封閉派生類對象的構造函數執行順序
在創建派生類的對象時
1.先執行基類的構造函數,用以初始化派生類對象從基類繼承的成員;
2.再執行成員對象類的構造函數,用以初始化派生類對象中成員對象。
消亡時析構與構造函數相反。
public繼承的複製兼容規則
1.派生類的對象可以賦值給基類對象(保留派生類中的基類內容)
2.派生類對象可以初始化基類引用
3.派生類對象的地址可以賦給基類指針(這點很重要,可以用此來實現多態)
如果派生方式是private或者protected,則上述三條不可行。
直接基類和間接基類
類A派生類B,類B派生類C,類C派生類D,。。。
類A是類B的直接基類
類B是類C的直接基類,類A是類C的間接基類
類C是類D的直接基類,類A、B是類D的間接基類
在聲明派生類時,只需要列出它的直接基類
派生類沿着類的層次自動向上繼承它的間接基類
派生類的成員包括
1.派生類自己定義的成員。
2.直接基類中的所有成員。
3.所有間接基類的全部成員。