PS:以下內容來自慕課網
一、三種繼承方式
無論哪種繼承方式,父類中private都繼承到子類中不可見位置,無法通過子類函數訪問。
1.公有繼承
公有繼承private限定符:
2.保護繼承
3.私有繼承
二、繼承中的特殊關系——隱藏與is A
1、隱藏
子類public繼承父類,子類中有成員函數與父類的同名但是參數不同的情況下,無法進行重載;父類的同名函數依舊會被隱藏;
子類.函數();調用的是子類中的成員函數,子類.父類::函數();調用的是父類的成員函數,同理同名數據成員。
2、Is a
父類的指針指向子類對象的時候 只能訪問子類中父類原有的數據成員和成員函數,而無法訪問子類中獨有的數據成員和成員函數
子類對象向父類對象賦值。或用子類對象初始化父類對象,本質是將子類當中從父類繼承下來的數據成員賦值給父類對象,而其他的數據將會被截斷,丟失。
父類指針指向子類對象。父類指針只能訪問父類原有的成員。
三、多繼承與多重繼承
c++對象的初始化順序是:
(a) 基類初始化
(b) 對象成員初時化
(c) 構造函數的賦值語句
假設 class C : public A, public B
{
D d;
};
則初始化的順序是A, B, D, C的構造函數。
這里基類的初始化順序是按照聲明的順序, 成員對象也是按照聲明的順序。 因此 C(int i, int j) : B(i), A(j) {} //這里成員初始化列表的順序是不起作用的
析構函數的順序則剛好是調過來, 構造/析構順序可看作是一種棧的順序。
四、虛繼承
例子:
補充說明:
虛繼承(編碼二)
老師:在虛繼承情況下,作為菱形繼承最頂層的父類並沒有進行參數傳遞,也就是說參數只使用了頂層父類的默認參數而無法從子類當中獲得傳入的參數。
課程評論:
首先virtual詞典里解釋為本質上存在但是沒有表現形式,而C++中 注意 virtual 寫在了共有繼承前面,意思就是在繼承時是真實存在但是不能被訪問;
換句話說,你在實例化對象MigrantWorker時需要實例化Farmar和Worker,而實例化這兩個對象需要先實例化一個Person,那么傳入值你選誰的?
所以系統此時設置為禁止訪問,在對象生成后你可以隨便訪問,因為你不可能通過兩種方式同時訪問一個對象內的成員。
采用初始化列表的方式來賦值,Per實例化時是不能被訪問的因此值傳不進去,如果你Far和Wor的構造函數體內用 m_strColor=color是可以改的。因為執行有先后順序,不沖突。