C 派生類的建構函式和複製控制函式

2021-06-21 23:39:22 字數 1547 閱讀 5470

複製成員和建構函式是不能被繼承的。每個類定義自己的,如果沒有,編譯器將自己生成。

派生類物件由派生類中定義的(非static)成員加上乙個或者多個基類子物件構成,因此影響是派生類物件的一些操作,對於它的操作同時也會對基類物件進行操作。只影響其直接基類的物件的操作。

一、派生類的建構函式

派生類的建構函式,受繼承關係影響,不單要初始化自己的資料成員,還要通過基類建構函式初始化基類資料成員。

1.1編譯器為派生類生成的預設的建構函式,首先呼叫其基類的建構函式,按照繼承順序來呼叫基類的預設建構函式。然後就可以按照規則對派生類自己的預設建構函式來進行。

1.2自己定義自己的建構函式,對於派生類的成員可以按照之前的規則進行,但是如果在初始化列表裡沒具體指定其基類的建構函式,則會呼叫基類的預設建構函式。

二、派生類的複製控制

派生類是否需要複製控制取決於類自身的直接成員。

複製建構函式

2.1編譯器生成的預設的複製建構函式,先使用基類的預設複製建構函式,然後再對派生類的資料成員進行複製。

2.2自己定義的複製建構函式,像普通的類那樣定義,特別的是應顯示的在初始化式中指定基類的複製建構函式。如果沒有這樣做的話,將呼叫的是基類的預設建構函式。這會造成一種奇怪的現象,新構造的物件的base部分保留預設值,而派生成員是另一物件的副本。

派生類賦值操作符

如果派生類定義了自己的賦值運演算法,則該操作符必須對基類部分進行顯示賦值。賦值操作符必須要防止自身賦值。

派生類析構函式

不負責撤銷基類物件的成員,編譯器總是顯示呼叫派生類物件基類部分的析構函式。每個建構函式只負責清除自己的成員。

一般情況下,析構函式宣告為虛函式,即使用virtual來修飾,這樣在清理乙個實際指向派生類物件的基類指標時,可以呼叫派生類的析構函式。虛析構函式的虛函式性質是繼承的。即如果基類是虛析構函式,則其派生類的析構函式也將是虛函式。

三、建構函式和析構函式中的虛函式

要理解在建構函式和析構函式中,編譯器認為物件型別發生了轉變。因此對於虛函式的繫結有一定的硬性。因此執行的是建構函式和析構函式自身型別的定義的版本。

測試**

class base

{public :

base(){cout<

cout<

delete pb;//派生類析構函式

如果使用上文注釋掉**替換相應的函式,發生如下變化

在派生類複製建構函式中沒有顯示的指明基類複製建構函式,因此呼叫的是基類預設建構函式

沒有把析構函式宣告為虛函式,則在指標物件析構時,呼叫的是基類的析構函式

鏈結一篇文章 關於派生類的建構函式和複製控制的 

派生類的建構函式和複製控制

因為派生類是從基類繼承而來的,所以包含了基類的一些成員,所以在寫派生類的建構函式和複製控制函式時,必須考慮基類的影響。先說建構函式,派生類的建構函式中,並不直接初始化基類的成員,而是呼叫基類的建構函式初始化基類的部分 class item base void func2 item base obj ...

定義派生類複製建構函式

如果派生類顯示定義自己的複製建構函式或賦值操作符,則該定義將完全覆蓋預設 定義。被繼承類的複製建構函式和賦值操作符負責對基類成分以及類自己的成員進行 複製或賦值。如果派生類定義了自己的複製建構函式,該複製建構函式一般應顯式使用基類 複製建構函式初始化物件的基類部分。class base class ...

C 派生類建構函式

派生類構造函式呼叫順序 1.基類的建構函式.2.子物件類的建構函式.3.派生類建構函式.當物件被刪除時,派生類的析構函式被執行,由於析構函式也不能被繼承,因此在執行派生類的析構函式時,基類的析構函式也會被呼叫。先執行派生類的析構函式,再執行子物件類的析構函式,再執行基類的建構函式。include u...