首先謹記兩條規則:
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 虛函式表指標 乙個類裡面不管有幾個虛函式,只有乙個虛函式表,只需將其加入表中即可,而指向這個表的指標只有乙個,即虛函式表指標 根據賦值相容規則,父類通過指標和引用子類物件後,只能訪問父類的方法,那為什麼將父類的函式寫為虛函式,子類重寫後,父類卻可以...