天天看點

【C++】 類和對象期末複習筆記(三)——繼承和派生

引言:

前面已經寫了兩篇基礎篇筆記,這一篇是繼承和派生專題。

前兩篇筆記位址如下👇

筆記一

筆記二

正文:

1、繼承分為單一繼承和多重繼承

單一繼承:派生類僅由一個基類派生

多重繼承:派生類由多個基類派生

2、繼承方式:公有繼承(派生)public、保護繼承(派生)protected、私有繼承(派生)private

例:

class B public:A
{
	......	
};

class B protected:A
{
	......	
};

class B private:A
{
	......	
};
           

3、A派生了B=B繼承了A

4、不同繼承方式下,基類成員的通路權限在派生類中的邊變化。(見圖)

【C++】 類和對象期末複習筆記(三)——繼承和派生

5、無論何種繼承方式,基類的private成員在派生類中均不可直接通路。

6、在有繼承的情況下,無論何種繼承方式,private成員都無法在派生類中被直接通路。而對于protected成員,無論何種繼承方式,在派生類中都可以被直接通路。

7、一般在類的繼承體系中,将類的資料成員的通路權限定義為protected較好。

8、多重繼承:一個派生類有多個基類。

例:

class Circle:public Point, public Radius
{
	......
};
           

9、若一個類是由多個基類派生出來的,則在定義派生類構造函數時,需要調用基類的構造函數,初始化基類成員。

10、派生類構造函數的執行順序為:首先依次調用基類構造函數,然後執行派生類自身的構造函數體。

11、析構函數的執行順序為:首先執行派生類自身的析構函數體,然後調用基類的析構函數。

12、當基類的構造函數沒有參數或沒有顯示定義構造函數時,派生類可以不向基類傳遞參數,甚至不定義構造函數。

13、當基類含有帶參的構造函數時,由于派生類不能繼承基類的構造函數或析構函數,派生類必須定義構造函數,以傳參給基類構造函數。

14、派生類構造函數的調用順序:先調用基類的構造函數,再調用對象成員的構造函數,最後調用對象自身的構造函數。

15、派生類析構函數的調用順序和構造函數相反。

16、基類的構造函數和析構函數都不會被派生類繼承。

17、在多重繼承中,當在派生類中出現兩個以上同名的可直接通路的基類成員時,便出現了二義性(通路沖突)。

18、當把派生類作為基類,繼續派生出新的派生類時,這種限定作用域的運算符不能嵌套使用,是錯誤的。

例:

19、任一基類在派生類中隻能被直接繼承一次。

20、支配規則:對同名成員的通路,派生類優先的優先關系。

21、虛基類

1)舉個經典的例子:假設定義了一個公共基類A,類B和類C都由類A公有派生,類D由類B和類C公有派生。顯然D包含類A的兩個拷貝,不僅多占用記憶體,而且還造成多個拷貝的資料不一緻。

是以,為了避免這種情況的出現,我們将基類設定為虛基類,當基類設定為虛基類時,隻拷貝一次虛基類。

2)如果派生類繼承了多個基類,基類中有虛基類和非虛基類,那麼在建立該派生類的對象時,先調用虛基類的構造函數,然後調用非虛基類的構造函數,最後調用派生類的構造函數。若虛基類有多個,則虛基類構造函數的調用順序取決于它們繼承時的說明順序。

3)定義虛基類的方法:在基類的類名前加關鍵字virtual。

例:

class A:virtual public B
{
	......	
};

class A:public virtual B
{
	......	
};
           

22、指派相容規則:可以将公有派生類的對象指派給基類對象,反之不允許。

23、指派相容與限制歸納:

1)公有繼承的派生類對象能指派給基類對象,私有或保護繼承的派生類對象不可以指派給基類對象。

2)公有繼承的派生類對象指派給基類對象時,系統将派生類對象中從基類繼承來的成員指派給基類對象。

3)不能将基類對象指派給派生類對象,因為派生類對象是基類對象的擴充,若能指派,則派生類對象擴充的部分将無值可賦。

4)在公有繼承的情況下,可将派生類對象的位址賦給基類的指針變量。

例:

5)在公有繼承的情況下,派生類對象可初始化基類的引用。

例:

24、相關題目

題目一:定義Person類并派生出Student和Teacher類

題目二:定義Date類和Time類并派生出DateTime類

上面兩題是繼承和派生的比較好的題目,綜合性較強,可以好好研究~

繼續閱讀