c 多型的原理 以及虛函式表詳解

2021-09-06 21:14:19 字數 2336 閱讀 1153

c++中多型的原理

要實現多型,必然在背後有自己的實現機制,如果不了解其背後的機制,就很難對其有更深的理解。

乙個多型的例子

class person;

};class children : public person

};class parents : public person;

};int main()

通過除錯我們以看到在乙個包含虛函式的person類的物件per中有著乙個隱藏的成員_vfptr虛函式指標,通過計算person類的大小,我們發現該類的大小為4 ,說明,該指標是存在的。

我們所看到的指標為虛函式表指標,指向乙個虛函式。乙個含有虛函式的表中都含有乙個虛函表,簡稱虛表,存放的是該類中虛函式的位址。

以上我們所看到的是基類物件,現在我們來看派生類中的物件的虛表

我們在基類person中增加兩個函式,乙個虛函式fun1,乙個普通函式fun2.

class person;

virtual void fun1()

void fun2()

};class children : public person

};class parents : public person;

virtual void fun3()

};typedef void(*fun) ();

void printvtable(fun vtable)

}int main()

通過派生類物件的記憶體模型,可以發現,在派生類的物件中也有了個虛函式表指標,但是在監視視窗中的虛函式表中並沒有派生類自己的虛函式的位址。

通過虛函式表指標我們可以將虛函式表列印出來看,通過列印出來的虛函式表,可以看出派生類自己的虛函式被放在最後,只不過在監視視窗沒有顯示出來。

實際上的多型就是不同的物件,在呼叫時查詢其虛函式表,找到要呼叫的函式,因為在派生類的虛函式表中已將完成了重寫,所以儘管呼叫的是同乙個函式,但完成的卻是不同的動作,乙個行為有多種狀態。

動態繫結與靜態繫結

動態繫結:動態繫結並不是在編譯階段確定函式的呼叫的,而是在執行階段來確定的。

多型的呼叫實質上就是動態的繫結,即函式的呼叫並不是在編譯期間確定的,而是在執行期間根據函式的呼叫情況在相應的物件中查詢並進行呼叫。

通過彙編**我們可以看到多型的函式呼叫是在執行時去確定的。

先在呼叫第二個虛函式fun1

單繼承下的虛函式表

多繼承下的虛函式表

class mother

};class father

};class son : public mother ,public father

virtual void fun2()

virtual void fun3()

};int main()

虛函式表存放在**

虛函式指標是存放在物件中,所以虛函式指標的位置是跟著物件的位置走的

虛函式表的位置是不確定的所以我們自己手動的測試,通過手動的測試,可以發現通過列印出的虛函式表的位址,與**區的位址極為相似,所以大致可以確定虛函式表是存放在**區的。

C 多型 虛函式 虛析構函式以及虛函式表

什麼是多型 指不同物件收到相同訊息時或相同物件收到不同訊息時產生不同的動作。這裡先說下為什麼會用到虛函式 以下面的程式為例 這個程式中,carp是fish的繼承類,而carp中覆蓋了swim這個方法,在makefishswim這個函式中,要使用fish類的形參,而你將yourfish這個carp類的...

C 多型 虛函式 指標 虛函式表

本文總結了和幾位老師的部落格 一 什麼是多型 關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術...

c 虛函式和多型 虛函式表

參考 1 c primer plus 第六版 2 中國大學慕課 程式設計與演算法 三 在類的定義中,前面有virtual關鍵字的成員函式就是虛函式 class a 類外函式定義 void a function 說明 1 virtual關鍵字只需要在類定義裡的函式宣告時加上,函式定義時不用加 2 建構...