類的繼承 繼承中的構造和析構

2021-08-20 08:48:44 字數 1865 閱讀 3426

本文參照於狄泰軟體學院,唐佐林老師的——《c++深度剖析教程》

問題:我們繼承了父類後,如何初始化父類成員?父類建構函式和子類建構函式有什麼關係?

子類中可以定義建構函式

子類建構函式必須對繼承而來的成員進行初始化

直接通過初始化列表或者賦值的方式進行初始化

呼叫父類建構函式進行初始化

父類建構函式在子類中的呼叫方式

預設呼叫:適用於無參建構函式和使用預設引數的建構函式

顯示呼叫:通過初始化列表進行呼叫,適用於所有父類的建構函式。

示例**:子類的構造初探

#include 

#include

using

namespace

std;

class parent

parent(string s)

};class child : public parent

child(string s) : parent(s)

};int main()

輸出結果:

parent()

child()

parent(string s) : cc

child(string s) : cc

從輸出結果我們可以知道

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

2. 先執行父類建構函式再執行子類的建構函式

3. 父類建構函式可以被隱式呼叫或者顯式呼叫。

問題:在工程專案中,不可能單純只有繼承或者組合關係,而是二者摻和在一起,那麼物件的建構函式又是如何的呢?

示例**:子類構造深度解析

#include 

#include

using

namespace

std;

class object

};class parent : public object

parent(string s) : object(s)

};class child : public parent

child(string s) : parent(s), mo1(s + " 1"), mo2(s + " 2")

};int main()

輸出結果:

object(string s) : cc

parent(string s) : cc

object(string s) : cc 1

object(string s) : cc 2

child(string s) : cc

從輸出結果我們可以知道物件建立時建構函式的呼叫順序

1. 呼叫父類的建構函式

如果父類還有父類那就先呼叫父類的父類的建構函式。

2. 呼叫成員變數的建構函式

3. 呼叫類自身的建構函式

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

問題:既然知道建構函式的呼叫順序,那麼析構函式的呼叫順序又是怎麼樣的呢?

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

1. 執行自身的析構函式

2. 執行成員變數的析構函式

3. 執行父類的析構函式

析構函式的呼叫順序與建構函式的呼叫順序剛好相反。

類繼承 繼承類的建構函式

派生類不能直接訪問基類的私有成員,必須通過基類提供的公有方法。派生類不能繼承基類的建構函式,因為建構函式和成員函式存在區別 建構函式用於建立新的物件,而其他成員函式是被現有的物件呼叫。派生類建構函式必須使用基類的建構函式。建立派生類物件時,先建立基類物件,因此基類物件應該在進入派生類建構函式之前被建...

繼承中的構造和析構

子類的建構函式必須對繼承而來的成員進行初始化 1.直接通過初始化列表或者賦值的方式進行初始 2.呼叫父類建構函式進行初始化 父類建構函式在子類中的呼叫方式 1.預設呼叫.適用無參建構函式和使用預設引數的建構函式 2.顯示呼叫.通過初始化列表進行呼叫,適用於所有父類的建構函式 例子 class chi...

繼承中構造析構

在繼承中面臨乙個問題就是 我們的基類和派生類都有各自的建構函式和析構函式,那麼再例項化派生類成員的時候,這個構造析構的順序是怎麼樣的呢?class animal animal void setm int a 0 intgetage private int age 我們構造了個動物類,我們需要繼續構造...