多型原理分析

2022-09-16 19:15:13 字數 1436 閱讀 1160

首先謹記兩條規則:

1.可以將乙個派生類的物件的位址賦值給其基類的指標變數,但是只能通過這個指標訪問派生類中由基類繼承來的隱藏物件,不能訪問派生類中的新成員。同樣也不可反過來做。

2.派生類物件可以初始化基類的引用。引用是別名,但這個別名只能包含派生類物件中的由基類繼承來的隱藏物件。

多型的實現是遵從這兩條規則的

此次分清楚三個名詞

過載:在乙個類中引數列表不同的函式(例如運算子過載)

隱藏:子類將中與父類同名方法全部隱藏(無虛函式時的同名隱藏)

覆蓋:虛表的覆蓋(多型的原理)

接著就是實現多型條件

1.必須有類的繼承

2.有虛函式

3.子類重寫虛函式

4.通過父類的指標或引用調動該函式。

子類實現多型的原理就是遵循開始的兩條規則,在類內部建立乙個虛表,使父類有覆蓋的函式用子類重寫的函式將其覆蓋掉。這樣,父類物件的指標或者引用就可以通過自己訪問子類重寫的函式了。

//

test1.h

#includeusing

namespace

std;

class

fish

;

virtual

void

eat(){};

};class

animal

;

virtual

void

eat(){};

};class shark : public fish,public

animal

;void shark::eat1()

void shark::water()

void fun(fish *f)

#include"

test1.h

"void

main()

新增斷點檢視虛表

由於water方法有覆蓋,所以fish和animal父類均將自己的虛表water替換成子類的water

若將shark類的water函式修改成water1則兩個父類的虛表為

可以清楚地看出父類並沒有用子類覆蓋(不滿足多型三同條件:同名、同返回型別、同引數列表)

四條多型規則

1.單繼承無覆蓋,子類重寫的函式會在父類的末尾進行增加

2.單繼承有覆蓋,子類的重寫的函式會覆蓋父類的虛函式

3.多繼承在未覆蓋的條件下,子類重寫的函式僅僅會在第乙個父類的末尾進行增加

4.多繼承在覆蓋的條件下,子類中重寫的函式會覆蓋所有父類中有該虛函式函式的函式

C 多型實現原理分析

前言 虛函式執行速度要稍慢一些。為了實現多型性,每乙個派生類中均要儲存相應虛函式的入口位址表,函式的呼叫機制也是間接實現。所以多型性總是要付出一定代價,但通用性是乙個更高的目標。實驗環境 windows10 企業版 visual studio2017 15.8.1 引入虛函式後記憶體大小變 化 沒有...

C 多型的實現原理分析

在物件導向開發中,多型是乙個很重要的特性。什麼是多型呢?就是程式執行時,父類指標可以根據具體指向的子類物件,來執行不同的函式,表現為多型。看完上面的實現原理,你可能會覺得有點懵,接下來我們就一點點分析和驗證上面的結論。include using namespace std class parent ...

C 基礎 多型的實現原理分析

多型的實現原理分析 virtual fun ptr 虛函式表指標 乙個類裡面不管有幾個虛函式,只有乙個虛函式表,只需將其加入表中即可,而指向這個表的指標只有乙個,即虛函式表指標 根據賦值相容規則,父類通過指標和引用子類物件後,只能訪問父類的方法,那為什麼將父類的函式寫為虛函式,子類重寫後,父類卻可以...