繼承的構造與析構

2021-07-27 09:40:48 字數 2165 閱讀 8910

賦值相容規則是指在需要基類物件的任何地方都可以使用公有派生類的物件來替代。

在共有public繼承的條件下:

子類物件可以當作父類物件使用

子類物件可以直接賦值給父類物件。

子類物件可以直接初始化父類物件。

父類指標可以直接指向子類物件。

父類引用可以直接引用子類物件。

**舉例:

#include 

#include

using

namespace

std;

class parent

void print()

};int main(int argc, char *argv)

上面的程式中,列印出來的全部都是child,產生的都是子類。用子類進行賦值。沒有執行父類當中的建構函式而是執行了父類的拷貝建構函式。

類在c++編譯器的內部可以理解為結構體

子類是由父類成員疊加子類新成員得到的。

如下圖所示:

在子類物件構造的時候需要呼叫父類建構函式對其繼承得來的成員進行初始化。

如下圖所示:

在子類物件析構的時候需要呼叫父類析構函式對其繼承得來的成員進行清理。

如下圖所示:

子類物件在建立時會首先呼叫父類的建構函式。

父類建構函式執行結束後,執行子類的建構函式。

當父類的建構函式有引數時,需要在子類的初始化列表中顯式呼叫

析構函式呼叫的先後順序與建構函式相反

舉例說明:

組合:類中的成員變數可以是其它類的物件。

如果乙個類繼承自父類並且有其它的物件作為成員,那麼建構函式如何呼叫?

口訣:先父母,後客人,再自己。

如下圖所示,呼叫順序並非按照初始化列表所列:

在上面的程式中,實際的建構函式的呼叫順序與初始化列表的順序正好相反。現構造parent父類的建構函式,然後再是o1物件的建構函式,最後是o2物件的。最後是呼叫自己的建構函式。

初始化列表中的順序沒有任何作用。

當子類中定義的成員變數與父類中的成員變數同名時會發生什麼?

當子類成員變數與父類成員變數同名時:

子類依然從父類繼承同名成員。

在子類中通過作用域分別符 ::進行同名成員區分。

同名成員儲存在記憶體中的不同位置。

如下圖所示:

子類物件可以當作父類物件使用。

子類物件在建立時需要呼叫父類建構函式進行初始化。

子類物件在銷毀時需要呼叫父類析構函式進行清理。

先執行父類建構函式,再執行成員建構函式。

在繼承中的析構順序與構造順序對稱相反。

同名成員通過作用域分辨符進行區分。

繼承的構造與析構

子類物件在構造時,先呼叫父類的建構函式,然後再呼叫自己的建構函式,析構順序相反。看下測試 include include using namespace std class grandparent public grandparent cout 輸出結果如下 結果很明顯了,子類構造時,先呼叫父親的建...

繼承的構造與析構

子類物件在構造時,先呼叫父類的建構函式,然後再呼叫自己的建構函式,析構順序相反。看下測試 include include using namespace std class grandparent public grandparent cout 輸出結果如下 結果很明顯了,子類構造時,先呼叫父親的建...

構造 析構 物件與繼承

c 學習筆記之二 上一節講到了建構函式,這一節繼續講解。1 建構函式可以被過載,如 object object int object 這兩個函式是具有相同的函式名,而引數個數或引數型別不同,這就是過載。2 析構函式 特點 沒有返回值,以 打頭,且函式在物件銷毀時呼叫 即作用域結束時被呼叫 出了作用域...