C++學習筆記---類的繼承(二)

有Child類繼承於Parent類
 class Child : public Parent{}
 那麼,當創建一個子類對象時:(編輯器默認動作)
 子類對象構造時,先調用父類的構造函數,再調用子類的構造函數。
 子類對象析構時,先調用子類的析構函數,再調用父類的析構函數。
 當父類有多個構造函數,可以顯式的調用其中的一個構造函數。
 如果沒有顯示調用,則調用了父類的“默認構造函數”
 class Child : public Parent
 {
public:
Child():Parent(1,1)
{
}
 }
 當一個類被繼承時,應該將父類的析構函數聲明爲virtual,否則會有潛在的問題。
 class Parent
 {
virtual ~Parent(){}
 }
 析構函數聲明爲virtual爲了考慮以下場景:
 Parent * p = new Child();
 delete p;
 如果析構函數沒有標識爲virtual,則有潛在的隱患,並有可能直接導致程序崩潰。(資源沒有被釋放,及延伸問題)。
 (1)類的大小由成員變量決定,與成員函數的個數無關,成員函數對所佔內存空間是沒有影響的。
 (2)如果有成員函數被聲明爲virtual,那類的大小會有些微的變化
 多重繼承
 語法:
 用Father,Mother表示兩個類
 class Child:public Father ,public Mother
 {
 };
 表示Child繼承於Father,Mother
 在寫法上,以冒號引導,每個父類用逗號隔開
 多重繼承的結果:從所有父類中,繼承他們所有可以被繼承的成員(public/protected)
 多重繼承的問題:很明顯,當多個父類有相同的成員時,會影響衝突。所以一般不使用。
 純虛函數的語法:
(1)將成員函數聲明爲virtual
(2)後面加上 =0
(3)該函數沒有函數體
例如:
class CmdHandler
{
public:
virtual void OnCommand(char* cmdline) = 0;
};
含有純虛函數的類,稱爲抽象類(或稱純虛類)。
例如,CmdHandler中有一個純虛函數OnCommand(),因此,它是純虛類
 抽象類不能夠被實例化,即無法創建該對象。
 CmdHandler ch ; //編譯錯誤
 CmdHandler * p = new CmdHandler();//編譯錯誤
 抽象類/純虛函數的實際用途:充當的“接口規範”
 接口規範:凡是遵循此規範的類,都必須實現指定的函數接口。通常是一系列接口。
 比如:
 class CmdHandler
 {
public :
virtual void OnCommand(const char* cmdline)=0;
 };
 可以理解爲:凡是遵循CmdHandler規範的類,都必須實現指定的函數接口:OnCommand()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章