久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

探究c++虛表實現代碼

虛表是一種利用程序語言實現的dynamic dispatch機制,或者說runtime method binding機制,也就是我們說的多態。本文簡單探究虛表實現方法,一起看看吧

本文簡單探究虛表實現。

如下代碼中有一個基類CPerson和子類CStudent:public.并有兩個虛函數runcry


#include<iostream>
using namespace std;
class CPerson {
public:
	virtual	void run() {
		cout << "Person is  runing. \r\n";
	}
	virtual void cry() {
		cout << "Person is  cry. \r\n";
	}
};
class CStudent:public CPerson {
public:
	void run() {
		cout << "Student is  runing. \r\n";
	}
	void cry() {
		cout << "Student is  cry. \r\n";
	}
};
int main() {
	CPerson * pStudent = new CStudent();
	pStudent->run();
	getchar();
	return 0;
}

VScl提供了對應命令行查看類的內存布局。
語法cl /d1 reportSingleClassLayoutXXXX YYYY。其中XXX為類名,YYYY為所在文件全路徑。
如本例:
cl /d1 reportSingleClassLayoutCStudent \\Mac\Main.cpp輸出如下:

在這里插入圖片描述

我們再看下CPerson的輸出:

在這里插入圖片描述

上面的圖可能很抽象,大致的意思一個CStudent的內存區域中的第一個內存區域存放一個4字節指針,指針指向一個另一個內存區域,這個內存區域我們稱為虛表。虛表內存結構可以理解為一個數組,數組中的每個元素是一個函數指針。指向函數地址。

示例圖:

在這里插入圖片描述

空說無憑,我們利用VS內存查看器和匯編器證實猜測。

在這里插入圖片描述

上圖簡單來說就是:
(1) 構造了一個CStudent對象,地址為0x00d88d28
(2) 進入對象的地址,對象內存的第一個4字節區域為0x00f89b78,這個存儲的數值為虛表指針位置。
(3) 進入虛表內存地址,發現存儲了兩個指針 0xf8105f0xf81406.

我們再次跳轉到0xf8105f內存地址,此時我們查看匯編級別代碼。發現是一個jmp指令跳轉到實際CStudent::run函數.

在這里插入圖片描述

同理0xf81406如下圖所示:

在這里插入圖片描述

其他擴展知識:

虛表在編譯時已經構造完成,在構造對象時,會根據對象的類型在初始化時賦值虛表地址給對象的vfptr 。我們把這種行為稱為動態綁定(Dynamic Binding)

到此這篇關于探究c++虛表實現代碼的文章就介紹到這了,更多相關c++虛表內容請搜索html5模板網以前的文章希望大家以后多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

主站蜘蛛池模板: 中文字幕色站 | 欧美精品一区二区在线观看 | 日本免费视频在线观看 | 黄色网页在线 | 毛片免费在线 | 亚洲成人av | 99久久99久久精品国产片果冰 | 亚洲欧美激情国产综合久久久 | 亚洲三区视频 | 一区二区三区四区在线视频 | 国产精品日韩一区 | 色综合久久久 | 午夜av电影 | 天天操 天天操 | 九九热精品视频 | 欧美a免费 | 91成人影院 | 国产乱码精品一区二区三区忘忧草 | 国产欧美日韩精品一区 | 国产精品中文字幕一区二区三区 | 一级毛片中国 | 国产精品一区二 | 超碰在线免费av | 欧美一级二级三级视频 | 国产一区二区在线看 | 午夜久久久久久久久久一区二区 | 久久不射电影网 | 在线视频日韩 | 草草草影院 | 国产欧美一区二区三区在线播放 | 日韩国产在线 | 亚洲国产一区视频 | 免费一级毛片 | 欧美白人做受xxxx视频 | 一区二区三区四区电影视频在线观看 | 国产精品99久久久久久www | 国产麻豆乱码精品一区二区三区 | 手机在线观看 | 国产精品国产自产拍高清 | 在线观看国产 | 午夜国产羞羞视频免费网站 |