C Record34 繼承中的構造和析構

2021-10-02 09:37:29 字數 2103 閱讀 6568

目錄

型別相容性原則

繼承中的物件記憶體模型

繼承中的構造析構呼叫原則

繼承中的構造析構呼叫順序原則

總體**

型別相容規則是指在需要基類物件的任何地方,都可以使用公有派生類的物件來替代。通過公有繼承,派生類得到了基類中除建構函式、析構函式之外的所有成員。這樣,公有派生類實際就具備了基類的所有功能,凡是基類能解決的問題,公有派生類都可以解決。型別相容規則中所指的替代包括以下情況:

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

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

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

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

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

在替代之後,派生類物件就可以作為基類的物件使用,但是只能使用從基類繼承的成員。

以上過程不可逆!

型別相容規則是多型性的重要基礎之一。

上例子,先定義乙個父類和子類:

class parent

howtoprint(&p1);

howtoprint(&c1);

再再繼續**,引用做函式引數,還是定義乙個全域性函式:

void howtoprint2(parent &base)

然後把子類的引用也可以傳給父類物件,編譯器也不會報錯,

//1-3引用做函式引數

howtoprint2(p1);

howtoprint2(c1);

如果我把這個過程給逆過來,就會報錯:

void howtoprint3(child &base)

howtoprint3(p1); //報錯了!

howtoprint3(c1);

所以,如果是把父類的引用傳給子類的話,就會出現報錯了! 

接下來,就是賦值相容性原則的第層含義:可以直接定義乙個父類物件p3,可以用子類物件來初始化它

//可以讓子類物件   初始化   父類物件

//子類就是一種特殊的父類

子類擁有了父類所有的成員變數及方法,如果子類再建立新的成員變數及方法,類會再分配記憶體的。

在學習繼承概念之前,成員通過建構函式的方式來進行初始化,那加入了繼承概念之後,如何進行初始化的呢?就比如子類如何初始化繼承而來的屬性和自己新新增的屬性呢?這就引導了下乙個話題。

問題:如何初始化父類成員?父類與子類的建構函式有什麼關係

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

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

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

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

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

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

舉例說明,先定義乙個父類和乙個子類:

父類中寫有參建構函式,

class parent

void main()

void howtoprint2(parent &base)

void main()

~child()

void printc()

protected:

private:

int c;

};void playobj()

void main()

C Record20 建構函式的呼叫規則

目錄 基本概念 二個特殊的建構函式 呼叫規則 涉及 寫在前面 本篇部落格所提到的賦值建構函式等同於拷貝建構函式及複製建構函式 1 預設無參建構函式 當類中沒有定義建構函式時,編譯器預設提供乙個無參建構函式,並且其函式體為空 2 預設拷貝建構函式 當類中沒有定義拷貝建構函式時,編譯器預設提供乙個預設拷...

繼承中的構造方法

繼承中的構造方法 a 子類的構造過程中必須呼叫其基類的構造方法。b 子類可以在自己的構造方法中使用super arguments.呼叫基類的構造方法。b.1 使用this arguments.呼叫本類的另外構造方法。b.2 如果呼叫super,必須寫在子類構造方法的第一行。c 如果子類的構造方法中沒...

繼承中的構造方法

package text 繼承中的構造方法 子類的構造的過程中必須呼叫其基類的構造方法 子類可以在自己的構造方法找個使用super 引數列表 呼叫基類的構造方法 注意 使用this 引數列表 呼叫本類外的構造方法 如果呼叫super,必須寫在子類構造方法的第一行 如果子類的構造方法中沒有顯示地調基類...