日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

类的不同实例化使用一张虚函数表

發布時間:2023/12/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 类的不同实例化使用一张虚函数表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 說明

眾所周知,每個帶有虛函數的類,或者繼承具有虛函數類的對象,本身都是會有一個虛函數表的,前者為自身創建的,后者為繼承,且虛函數表的指針位置位于類的首四位地址,如下圖所示!

如何獲取虛函數表地址?看下面代碼:

Obj obj; int vAddr = *(int *)(&obj); //獲取虛函數表地址

首先獲取類地址,將類地址強制轉為int類型數據(int數據地址),該地址保存的數據又是虛函數表的地址,所以使用去除地址中的虛函數表地址。有點繞口,可以自行理解。

2 問題

同一個類,實例化兩次,每個實例化的類到底是都有一個虛函數表?還是所有該類實例化的對象使用同一個虛函數表?即下面代碼中

Obj obj_1; Obj obj_2;

obj_1 和 obj_2 是使用同一個虛函數表嗎?

先說答案! 所有實例是共用一個虛函數表。

3 測試

測試代碼:

#include "mainwindow.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;MainWindow w2;int vAddr_1 = *(int *)(&w);int vAddr_2 = *(int *)(&w2);printf("d_1:%i \n",vAddr_1);printf("d_2:%i \n",vAddr_2);w.show();w2.show();return a.exec(); }

結果顯示d_1和d_2數值一致,也就是說,指向的是同一個地址!即w和w2使用的同一個虛函數表。

4 推測

為什么要共用同一個虛函數表?可能是為了節省內存吧,首先同一個類的對象虛函數都是一樣的,沒必要重新伴隨構造生成一份一模一樣的表,所以拷貝虛函數表的表地址就行。

總結

以上是生活随笔為你收集整理的类的不同实例化使用一张虚函数表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。