C 多型的實現原理

2021-10-10 11:29:13 字數 1774 閱讀 5598

一、多型的概念

多型就是多種形態,c++的多型分為靜態多型與動態多型。

靜態多型就是過載,因為在編譯期決議確定,所以稱為靜態多型。在編譯時就可以確定函式位址。

動態多型就是通過繼承重寫基類的虛函式實現的多型,因為實在執行時決議確定,所以稱為動態多型。執行時在虛函式表中尋找呼叫函式的位址。

在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式。

如果物件型別是子類,就呼叫子類的函式;如果物件型別是父類,就呼叫父類的函式,(即指向父類調父類,指向子類調子類)此為多型的表現。

例:

class person   

protected :

string _name ; // 姓名

cout可以看到派生類derive::func1重寫基類base::func1,覆蓋了相應虛表位置上的函式。 ps:可以看到這裡沒有看到派生類derive中的func3和func4,這兩個函式就放在func2的後面,這裡沒有顯示是vs的問題(bug)。

每個類都有乙個虛函式表,每個物件都有乙個虛函式指標。如果物件型別是子類,就呼叫子類的函式;如果物件型別是父類,就呼叫父類的函式,(即指向父類調父類,指向子類調子類)此為多型的表現。

四、一些考題

因為普通函式是靜態聯編的,而呼叫虛函式是動態聯編的。

聯編的作用:程式呼叫函式,編譯器決定使用哪個可執行**塊。

明顯動態聯編要比靜態聯編做的操作多,肯定就費時間。

為什麼要用虛函式表(存函式指標的陣列)?

為什麼要把基類的析構函式定義為虛函式?

在用基類操作派生類時,為了防止執行基類的析構函式,不執行派生類的析構函式。因為這樣的刪除只能夠刪除基類物件, 而不能刪除子類物件, 形成了刪除一半角象, 會造成記憶體洩漏.如下**:

#includeusing namespace std;

class base

; ~base()

; };

class derived : public base

; ~derived()

; };

int main()

為什麼子類和父類的函式名不一樣,還可以構成重寫呢?

因為編譯器對析構函式的名字做了特殊處理,在內部函式名是一樣的。

C 多型的實現原理

1.用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。2.存在虛函式的類都有乙個一維的虛函式表叫做虛表。類的物件有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。3.多型性是乙個介面多種實現,是物件導向的核心。分為類的多型性和函式的多型性。4.多型用虛函式來實...

C 多型的實現原理

1.用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。2.存在虛函式的類都有乙個一維的虛函式表叫做虛表。類的物件有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。3.多型性是乙個介面多種實現,是物件導向的核心。分為類的多型性和函式的多型性。4.多型用虛函式來實...

C 多型的實現原理

純虛函式 virtual void breathe 0 即抽象類!必須在子類實現這個函式 即先有名稱,沒內容,在派生類實現內容 我們先看乙個例子 include class animal 注意,在例1 1的程式中沒有定義虛函式。考慮一下例1 1的程式執行的結果是什麼?答案是輸出 animal bre...