關於C 多型的學習講解

2021-12-30 04:31:38 字數 2232 閱讀 7283

-基於vs2017編譯器環境下

c ++的三大特性:封裝,繼承,態多下面我們看多型的英文什麼:。多型概念:多型從字面的意思就是「多種狀態」,但是在c ++中,多型有著更廣泛的含義。

從圖中,可看出,多型分為靜態多型和動態多型,靜態多型中,還分有函式過載和泛型程式設計動態多型就是有虛函式靜態多型:靜態多型是編譯器在編譯期間完成的,編譯器根據函式實參的型別(可能會進行隱式型別的轉換),可以推斷出要呼叫那個函式,如果有對應的函式,就呼叫該函式,如果沒有就編譯錯誤。動態多型:動態多型需要虛函式,在基類中有虛函式,在派生類中進行虛函式重寫。

動態多型的條件:

1.基類中必須包含虛函式,並且派生類一定要對基類中的虛函式進行重寫

2.通過基類物件的指標或者引用呼叫虛函式

下面通過一段簡單的**了解一下多型呼叫:

class base

void fun2()//普通函式

virtual void fun3()//虛函式 };

class derived :public base

virtual void fun2()//虛函式

void fun3()//普通函式 };

void test(base &b) //基類的指標或者引用傳參

重寫是什麼?

下面我們通過乙個圖來理清,繼承體系中同名成員函式的關係:

抽象類:

在成員函式(必須為虛函式)的形參列表後面寫上=0,則成員函式為純虛函式。包含純虛函式的雷叫做抽象類(也叫介面類),抽象類不能例項化物件。純虛函式在派生類中重定義後,派生類才能例項化物件。

總結派生類重寫基類的虛函式實現多型,要求函式名,引數列表,返回值完全相同(協變)

基類中定義了虛函式,在派生類中該函式始終保持虛函式的特性

只有類的非靜態成員函式才能定義為虛函式,靜態成員函式不能定義成虛函式

如果在類外定義虛函式,只能在宣告函式時加上virtual關鍵字,定義時不用加

建構函式不能定義成虛函式,雖然可以將operator=定義為虛函式,最好不要這樣做(容易混)

不要在建構函式和析構函式中呼叫虛函式,在建構函式和析構函式中,物件是不完整的,可能會出現未定義的行為

最好將基類的析構函式宣告為虛函式

虛表是所以類物件例項共用的

理解了多型,下面我們來看看多型的呼叫原理:

為什麼派生類對基類的虛函式進行重寫後,通過基類物件的指標或者引用,呼叫該函式時,就可以實現多型?

我們可以理解為,當我們定義類中有虛函式時,編譯器會為物件多開闢4個位元組作為物件的起始位址,物件的前4個位元組存放著乙個虛表,虛表的內容是類中定義的虛函式的位址,使我們呼叫虛函式時可以找到。

不同繼承下帶有虛函式的物件模型:

單繼承:

class base

virtual void fun2()

/*virtual void fun3()

*/int _b;

};class derived :public base

virtual void fun2()

int _d;

};int main()

{ derived d;

d._b = 1;

d._d = 2;

cout << "d的大小為"<

關於C 多型的學習

父類virtual type funcname arg 子類type funcname arg type funcname arg完全一致就算子類重寫了。覆蓋了基類的func。還可以 子類直接寫個override example type funcname arg override 這個是c 11的...

C 學習筆記之多型 多型的學習 多型學習

c 學習筆記之多型 多型的學習 多型學習 多型分為兩類 靜態多型 函式過載和運算子過載屬於靜態多型,復用函式名 動態多型 派生類和虛函式實現執行時多型 靜態多型和動態多型的區別 靜態多型的函式位址早繫結 編譯階段確定函式位址 動態多型的函式位址晚繫結 執行階段確定函式位址 動態多型滿足條件 動態多型...

C 繼承和多型 基本講解

一 繼承 1 語法 派生類,student裡面什麼也沒寫,但是他繼承了people class student people 2 使用說明 1 子類可以繼承父類的所有公有的屬性和方法,還有受保護的字段和方法,私有的字段和方法不會被繼承 2 例項化子類時會自動呼叫父類的 無參 構造方法 3 構造方法不...