c++複習(七)

第七章 類的繼承的基本概念和語法

繼承和派生
繼承和派生是從同一過程不同角度看:
保持已有類的特性而構造新類的過程稱爲繼承,在已有類的基礎上增加自己的特性而產生新類的過程叫做派生,被繼承的已有類叫做基類,派生出的新類叫做派生類,直接參與派生出某類的基類叫做直接基類,基類的基類甚至更高層的基類叫做間接基類

繼承是爲了實現設計與代碼重用,派生是爲了在遇到新問題時改進程序

單繼承時派生類的定義:
class 派生類名 :繼承方式 基類名
{
成員聲明;
}
例如:class Derived :public Base
{
public:
Derived();
~Derived();
};

多繼承時派生類的定義:
class 派生類名:繼承方式1 基類名1,繼承方式2 基類名2
{
成員聲明;
}

派生類的構成:吸收,改造,添加;除原函數中構造函數和析構函數之外的所有成員;

繼承的方式簡介:
公有:基類的public和protected成員,訪問屬性在派生類中保持不變,但是不能直接訪問private成員,通過派生類的對象,只能訪問public成員
私有:最嚴格的一種繼承,積累的所有成員都以private的方式出現
保護:

**類型轉換:**基類和派生類
公有派生類對象可以被當做基類的對象使用,反之不可以
派生類的對象可以隱含轉換爲基類對象,派生類的對象可以初始化基類的引用,派生類的指針可以隱含轉換爲基類的指針。
通過基類對象名,指針只能使用基類繼承的成員,

不要重新定義繼承而來的非虛函數

派生類的構造函數
派生類需要自己定義構造函數,無法繼承
c++11規定:可用using語句繼承基類構造函數,可是隻能初始化從基類繼承的成員,語法形式:using B::B;//不進行初始化,會產生垃圾數據

單繼承時構造函數的定義語法:
派生類名::派生類名(基類所需的形參,本類所需的形參):基類名(參數表),本類成員初始化列表
{
//其他初始化;
};

多繼承時構造函數的定義語法:
派生類名::派生類名(參數表):基類名1(基類初始化參數表)
,基類名2(基類初始化參數表)…
{
其他初始化;
};

派生類的複製構造函數:
若派生類定義複製構造函數:
一般都要爲基類的複製構造函數傳遞參數,複製構造函數只能接受一個參數,既用來初始化派生類定義的成員,也將被傳遞給基類的複製構造函數,基類的複製構造函數形參類型是基類對象的引用,實參可以是派生類對象的引用

派生類的析構函數:
析構函數不被繼承
系統會自動隱士的調用
析構順序與構造順序相反

訪問從基類繼承的成員:
作用域限定符::

二義性:如果從不同基類繼承了同名成員,但在派生類中沒有定義重名成員,“派生類對象名或者引用名.成員名”,"派生類指針->訪問成員"存在二義性問題,解決方式:用類名限定。
同名隱藏指的是:在基類和派生類中都定義了同名函數時,在派生類中調用時,直接調用派生類中的,而基類中的被隱藏

冗餘:浪費空間,不一致性,發生錯誤

虛基類:當派生類從多個基類派生,而這些基類又有共同基類,則在訪問此共同基類中的成員時,將產生冗餘,並有可能因爲冗餘帶來不一致性,在第一級繼承時將共同基類設計爲虛基類,可以解決冗餘問題。
聲明:以virtual說明基類繼承方式
例:class B1:virtual public B
建立對象時所指定的類稱爲最遠派生類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章