类的不同实例化使用一张虚函数表
1 說(shuō)明
眾所周知,每個(gè)帶有虛函數(shù)的類,或者繼承具有虛函數(shù)類的對(duì)象,本身都是會(huì)有一個(gè)虛函數(shù)表的,前者為自身創(chuàng)建的,后者為繼承,且虛函數(shù)表的指針位置位于類的首四位地址,如下圖所示!
如何獲取虛函數(shù)表地址?看下面代碼:
首先獲取類地址,將類地址強(qiáng)制轉(zhuǎn)為int類型數(shù)據(jù)(int數(shù)據(jù)地址),該地址保存的數(shù)據(jù)又是虛函數(shù)表的地址,所以使用去除地址中的虛函數(shù)表地址。有點(diǎn)繞口,可以自行理解。
2 問(wèn)題
同一個(gè)類,實(shí)例化兩次,每個(gè)實(shí)例化的類到底是都有一個(gè)虛函數(shù)表?還是所有該類實(shí)例化的對(duì)象使用同一個(gè)虛函數(shù)表?即下面代碼中
Obj obj_1; Obj obj_2;obj_1 和 obj_2 是使用同一個(gè)虛函數(shù)表嗎?
先說(shuō)答案! 所有實(shí)例是共用一個(gè)虛函數(shù)表。
3 測(cè)試
測(cè)試代碼:
#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(); }結(jié)果顯示d_1和d_2數(shù)值一致,也就是說(shuō),指向的是同一個(gè)地址!即w和w2使用的同一個(gè)虛函數(shù)表。
4 推測(cè)
為什么要共用同一個(gè)虛函數(shù)表?可能是為了節(jié)省內(nèi)存吧,首先同一個(gè)類的對(duì)象虛函數(shù)都是一樣的,沒(méi)必要重新伴隨構(gòu)造生成一份一模一樣的表,所以拷貝虛函數(shù)表的表地址就行。
總結(jié)
以上是生活随笔為你收集整理的类的不同实例化使用一张虚函数表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 落克王国经验计算机,洛克王国宠物经验计算
- 下一篇: java消息队列mq_我爱java系列-