15 7 派生類拷貝控制

2022-10-05 05:36:11 字數 2783 閱讀 1522

目錄15.7.3 派生類的拷貝控制成員

15.7.4 繼承的預設建構函式

在基類中將析構函式定義為虛函式,用動態繫結機制來保證執行正確的析構函式版本

class base;

//derived是base的派生類

base *itemp = new base; //靜態型別與動態型別一致

delete itemp; //呼叫base的析構函式

itemp = new derived; //靜態型別與動態型別不一致

delete itemp; //呼叫derived的析構函式

乙個基類總是需要乙個析構函式,且必須為虛函式

本節不**移動操作,只**合成的預設建構函式以及合成的預設析構函式

依次初始化派生類本身的成員

呼叫直接基類的合成的預設建構函式

如:quote是基類,disc_quote是quote的派生類,bulk_quote是disc_quote的派生類

如果基類構造了接受引數的建構函式而沒有定義預設建構函式,派生類無法合成預設的建構函式

class base;

class d : public base;

無法建立d物件,因為它無法初始化

d d; //報錯:無法引用「d」的預設建構函式--它是已刪除的函式
銷毀派生類自己的成員

銷毀派生類的直接基類

同樣:如果基類中的析構函式無法訪問或被定義為刪除的,那麼派生類中的析構函式也是刪除的,因為派生類無法析構它的基類部分

同時,派生類的合成的預設建構函式和拷貝函式也是刪除的,因為派生類無法析構它的基類部分

class base;

class d : public base;

派生類的預設建構函式、拷貝建構函式、拷貝賦值運算子、析構函式都會呼叫基類的對應函式

如果基類的對應函式是無法訪問或者刪除的,那麼在派生類中也是刪除的

直接用**來說明問題

派生類的拷貝建構函式

class base ;

class d: public base

d(d&& d): base(std::move(d)) //移動基類成員

/* d的成員的初始值 */

};

如果沒有提供基類的初始值

//d的這個拷貝建構函式很可能是不正確的

//基類部分被預設初始化,而非拷貝

d(const d& d): /* 成員初始值,沒有提供基類初始值*/

派生類賦值運算子顯示為基類部分賦值

//base::operator=(const base&)不會被自動執行

d& d::operator=(const d &rhs)

派生類的析構函式與拷貝建構函式和賦值運算子不同,派生類的析構函式只負責析構自身的成員

class d:public base

};

物件銷毀的順序正好與其建立的順序相反:派生類析構函式首先執行,然後是基類的析構函式,以此類推,沿著繼承體系的反方向直至最後。

派生類「繼承」基類建構函式的方式是提供一條註明了(直接)基類名的using宣告語句。

舉個例子,我們可以重新定義bulk_quote類(參見15.4節,第541頁),令其繼承disc_quote類的建構函式:

通常情況下,using宣告語句只是令某個名字在當前作用域內可見。而當作用於建構函式時,using宣告語句將令編譯器產生**

對於基類的每個建構函式,編譯器都生成乙個與之對應的派生類建構函式。換句話說,對於基類的每個建構函式,編譯器都在派生類中生成乙個形參列表完全相同的建構函式。

在我們的 bulk_quote類中,繼承的建構函式等價於:

注意點

基類建構函式的預設實參不會被繼承

被繼承。相反,派生類將獲得多個繼承的建構函式,其中每個建構函式分別省略掉乙個含有預設實參的形參。

例如,如果基類有乙個接受兩個形參的建構函式,其中第二個形參含有預設實參,則派生類將獲得兩個建構函式:乙個建構函式接受兩個形參(沒有預設實參),另乙個建構函式只接受乙個形參,它對應於基類中最左側的沒有預設值的那個形參。

如果基類含有幾個建構函式,則除了兩個例外情況,大多數時候派生類會繼承所有這些建構函式。

第乙個例外是派生類可以繼承一部分建構函式,而為其他建構函式定義自己的版本。如果派生類定義的建構函式與基類的建構函式具有相同的引數列表,則該建構函式將不會被繼承。定義在派生類中的建構函式將替換繼承而來的建構函式。

第二個例外是預設、拷貝和移動建構函式不會被繼承。這些建構函式按照正常規則被合成。繼承的建構函式不會被作為使用者定義的建構函式來使用,因此,如果乙個類只含有繼承的建構函式,則它也將擁有乙個合成的預設建構函式。

C Record33 派生類的訪問控制

目錄 單個類的訪問控制 c 中的繼承方式會影響子類的對外訪問屬性 公有繼承 私有繼承 保護繼承 判斷總結 c 中子類對外訪問屬性表 總體 派生類繼承了基類的全部成員變數和成員方法 除了構造和析構之外的成員方法 但是這些成員的訪問屬性,在派生過程中是可以調整的。首先要明白 public 修飾的成員變數...

1 4 3 7 派生類的構造方法

根據改寫。加入自己見解使其更易懂 如下 功能 講述上圖派生類建構函式的執行順序 包含各層次類都靜態構造 例項建構函式 public class mybaseclass public mybaseclass 5.第乙個類的例項建構函式執行 public class mydrivedclass myba...

(35 1)派生類的建構函式

建構函式和類的名字是一致的 派生類名 形式引數列表 基類名 基類建構函式實參列表 派生類初始化列表 class point 建構函式 class rect public point 派生類建構函式 類名 形式引數列表 子物件名 子物件建構函式實參列表 類初始化列表 classa a類沒有建構函式,系...