c++繼承是c里面學習比較難的,在這里告訴你c++繼承,從各個方面來給你一一擊破難點。讓你快速學習。
面向對象程序設計中最重要的一個概念是繼承。繼承允許我們依據另一個類來定義一個類,這使得創建和維護一個應用程序變得更容易。這樣做,也達到了重用代碼功能和提高執行時間的效果。
當創建一個類時,您不需要重新編寫新的數據成員和成員函數,只需指定新建的類繼承了一個已有的類的成員即可。這個已有的類稱為基類,新建的類稱為派生類。
如何實現繼承?
一個類可以派生自多個類,這意味著,它可以從多個基類繼承數據和函數。定義一個派生類,我們使用一個類派生列表來指定基類。類派生列表以一個或多個基類命名,形式如下:
class derivedclass: accessspecifier baseclass
其中,訪問修飾符 access-specifier 是 public、
protected 或 private 其中的一個,base-class 是之前定義過的某個類的名稱。如果未使用訪問修飾符 access-specifier,則默認為private。
注:
子類也可以稱為派生類,父類可以稱為基類。
繼承后,子類會完全繼承父類中所有的成員變量和成員函數(除父類的構造函數以外)
public :公有的成員在任何地方都可以訪問
protected:受保護的成員,在類的作用范圍內可以訪問,友元也可以訪問,在其派生類中也可以訪問,在類的外部不能訪問。
private:私有的成員在類的作用范圍內可以訪問,友元也可以訪問。
一個派生類繼承了所有的基類方法,但下列情況除外:
基類的構造函數、析構函數和拷貝構造函數。
基類的重載運算符。
基類的友元函數。
構造和析構的順序:
子類的構造函數一定會先調用父類的構造函數,先初始化從父類繼承而來的成員變量,再調用自己的構造函數初始化新增的成員變量。
析構相反,先調用子類的析構函數釋放新增內存,再調用父類的析構函數釋放從父類繼承而來的部分。
當父類的構造函數沒有參數的時候,子類的構造函數可以不主動調用父類的構造函數,但是父類的構造函數依然會被自動調用。
三種繼承方式:
1.公有繼承 父類的公有成員繼承到子類中是公有屬性,父類的保護成員繼承到子類中是保護屬性,父類的私有成員繼承到子類中不可訪問。
2.保護繼承 父類的公有成員繼承到子類中是保護屬性,父類的保護成員繼承到子類中是保護屬性,父類的私有成員繼承到子類中不可訪問
3.私有繼承 父類的公有成員繼承到子類中是私有屬性,父類的保護成員繼承到子類中是私有屬性,父類的私有成員繼承到子類中不可訪問
公有成員保護成員私有成員
公有繼承公有成員保護成員不可訪問成員(通過基類接口訪問)
保護繼承保護成員保護成員不可訪問成員(通過基類接口訪問)
私有繼承私有成員私有成員不可訪問成員(通過基類接口訪問)
在類的內部:只有父類的私有成員不能訪問。
在類的外部:只能訪問該對象的公有成員
多層繼承
A繼承自B,B繼承自C,可以得出,A繼承了C,繼承具有傳遞性多重繼承
一個類繼承自多個父類
如何多重繼承?
class 子類名 :public 父類1名, public 父類2名...
{
子類成員....
};
多重繼承構造函數的順序?
一定先從左到右依次調用父類的構造函數,再調用自己的構造函數析構的順序相反。
多重繼承會引發二義性,如何解決?
方法1:在調用具有二義性的成員函數時,指明函數的作用域,到底是從哪個基類繼承而來的。
方法2:虛繼承
C++使用虛擬繼承(Virtual Inheritance),解決從不同途徑繼承
來的同名的數據成員在內存中有不同的拷貝造成數據不一致問題,
將共同基類設置為虛基類。這時從不同的路徑繼承過來的同名數據成員
在內存中就只有一個拷貝,同一個函數名也只有一個映射。
繼承的關系
has-a 有什么。 組合關系不能構成繼承關系 is-a 是什么, 能構成繼承關系
like-a 像什么一樣 不能構成繼承關系 as---a 作為實現手段 不能構成繼承關系總結:
當類中有成員變量是其他類的對象的時候,先從上到下依次構造對象成
員,再調用自己的構造函數。
析構的順序相反。
當類中既有多重繼承,又有成員變量是其他類的對象,先從左到右依次調用父類構造函數,再從上到下
依次構造對象成員,最后調用自己的構造函數。