C 類學習總結 六 繼承與多型 續

2021-10-08 16:54:08 字數 3063 閱讀 7465

定義基類

①.成員函式

用作基類的類通常會包含兩種成員函式:一是希望派生類進行覆蓋自己實現的函式,定義為虛函式;二是希望派生類直接繼而不改變實現的函式。

②.虛析構函式

基類的析構函式必須是虛函式,為了多型時能執行動態繫結從而正確的釋放記憶體。

③.受保護成員

使用關鍵字 protected 來宣告受保護的成員。類似私有成員,類外不可訪問;類似共有成員,派生類及友元可以訪問;派生類從成員或者友元只能通過派生類物件訪問基類受保護成員。

class base

; virtual fucation();//虛成員函式

virtual ~base();//虛析構函式

private:

string str;

protected:

int i;

};

抽象基類

①.純虛函式

通過在函式體後加 =0 可以定義乙個純虛函式。乙個純虛函式無須定義其實現、但也可以為其定義實現,但必須是在類的外部定義。

②.抽象基類

包含有純虛函式的類就是抽象基類,抽象基類不可以進行例項化操作。

class base

; virtual void fucation() = 0;//純虛函式

virtual ~base();//虛析構函式

private:

string str;

protected:

int i;

};base b;//出錯,不能例項化乙個抽象類

派生類的定義

①.派生類的宣告必須包含類派生列表

②.用作繼承的基類必須是已定義的

class derived:public base

; void fucation(); //覆蓋基類中虛函式

private:

int j;

}

派生類中虛函式

①.virtual 非必須

一旦某個函式被定義成虛函式,則在所有派生類中都是虛函式,因此在派生類中可以不加 virtual 關鍵字。

②.形參型別及返回型別必須和基類保持一致

若派生類中虛函式的返回型別或者形參型別與基類不一致時,派生類中將會覆蓋掉基類版本。

③.不更改派生中虛函式的引數預設值

不應該重新定義乙個繼承而來的引數預設值,因為引數預設值是靜態繫結,會得到和預期不一致的結果。

派生類物件

①.派生類物件構成

乙個派生類物件可用認為有兩部分構成:一是繼承的基類對應的子物件;二是派生類自身定義的成員物件。

因為派生類中包含有基類對應的部分,因此把把派生類物件當作基類物件來使用,也可以使用基類的指標或者引用繫結到派生類物件的基類部分。

②.型別轉換

基類的指標或者引用可用執行派生類物件,派生類向基類的隱式轉換只針對指標或者引用有效;若基類的共用成員是可訪問的,則派生類物件也可以轉換成基類物件。

構造與析構函式

①.子類不繼承基類建構函式

本質上子類會繼承記錄所有函式,包括建構函式,但是子類建構函式會覆蓋基類的建構函式,看起來沒有繼承。若子類不定義任何建構函式,會預設呼叫父類的無引數建構函式。

class base

; virtual ~base();//虛析構函式

private:

string str;

};class derived:public base

;d d;//出錯,基類沒有無引數建構函式,派生類也無無引數建構函式

②.析構函式必須是虛函式

非多型時,基類析構函式不是虛函式沒有影響,可以正確釋放記憶體。

多型時,基類析構函式不是虛函式,將會操作派生類部分記憶體沒有正確釋放。

③.派生類的建構函式只初始化它的直接基類

基類預設建構函式初始化派生類中基類部分,如果我們想拷貝或者移動基類部分,則必須在派生類的建構函式初始值列表中顯式的使用基類的拷貝或者移動建構函式;派生類的賦值運算子也必須為其基類部分賦值。

概念①.靜態型別:在編譯時已知,是變數在宣告時的型別。

②.動態型別:是變數表示的在記憶體中的物件的型別,直到執行時才可知。

③.多型:指向基類的指標或者引用直到程式執行時,才能確定指向的實際物件型別;多型就是根據實際的物件型別決定函式呼叫語句的具體呼叫目標。

虛函式表

①.虛函式表:虛函式表是乙個儲存成員函式指標的資料結構,是乙個指標陣列,每個元素對應乙個虛函式的函式指標;虛函式表是屬於類的,乙個類一張表,由編譯器在編譯階段自動生成和維護。

②.虛表指標:在每個類的物件內部包含乙個虛表指標,指向自己所屬類的虛表;物件在建立時,由編譯器對vptr指標進行初始化,定義子類物件時,虛表指標先指向父類的虛函式表,在父類構造完成之後,子類的虛表指標才指向自己的虛函式表。

③.虛函式呼叫:物件的虛表指標用來指向自己所屬類的虛表,虛表中的指標會指向其繼承的最近的乙個類的虛函式。

C 類學習總結 五 繼承與多型

基本概念 基類 可供其他類繼承的類,基類的成員也將成為派生類的成員。派生類 從基類繼承而來的類,稱為派生類。虛函式 基類中希望其派生類可以定義自己版本的函式宣告為虛函式,使用關鍵字 virtual 純虛函式 在類內部宣告虛函式時,在分號之前使用 0,虛函式可用沒有定義。抽象基類 含有乙個或者多個純虛...

C 學習筆記 繼承與多型

1 關於繼承 inheritance 的概念 在c 中有 has a 和 is a 的 兩個概念。1.1 has a 即為在乙個類定義中包含另乙個類的物件 class a class b 1.2 is a 即我們說的繼承 如下,b繼承a,a為基類,b為a的派生類,b繼承了a的所有資料成員和成員函式。...

c 學習筆記( )繼承與多型

1.繼承的作用 復用 2.派生類繼承基類的什麼東西 除了基類的構造和析構函式以外的所有成員 3.public 任意位置都可以訪問 protected 本類類中,子類類中訪問 private 本類類中訪問 基類中不同的訪問限定符下的成員以不同的繼承方式在派生類中的訪問限定 public protect...