天天看點

C++ 對象模型學習筆記九: 虛函數表指針位置分析

知識點:

類:有虛函數,這個類會産生一個虛函數表。

類對象:有一個指針,指針(vptr)會指向這個虛函數表的開始位址。類對象的虛函數表指針位置取決于編譯器。

測試代碼如下:

// 該執行個體測試驗證類對象的虛函數表指針在對象記憶體中的位置
// 方法:建立一個類 隻包含一個 int 成員變量和一個 虛函數-->産生一個虛函數指針,對象記憶體共8個位元組

#include <iostream>
using namespace std;

class A
{
public:
	int i; //4位元組
	virtual void testfunc() {}  //虛函數,vptr4位元組。
};

int main()
{
	//虛函數表指針位置分析
	A aobj;
	int ilen = sizeof(aobj);
	cout << ilen << endl;  //8位元組

	char *p1 = reinterpret_cast<char *>(&aobj); //類型轉換,硬轉 &aobj這是對象aobj的首位址。
	char *p2 = reinterpret_cast<char *>(&(aobj.i));
	if (p1 == p2) //說明aobj.i和aobj的位置相同,說明i在對象aobj記憶體布局的上邊。虛函數表指針vptr在下邊
	{
		cout << "虛函數表指針位于對象記憶體的末尾" << endl;
	}
	else
	{
		cout << "虛函數表指針位于對象記憶體的開頭" << endl;
	}



	return 1;
}


           

運作結果:

C++ 對象模型學習筆記九: 虛函數表指針位置分析