类的不同实例化使用一张虚函数表
生活随笔
收集整理的這篇文章主要介紹了
类的不同实例化使用一张虚函数表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 說明
眾所周知,每個帶有虛函數的類,或者繼承具有虛函數類的對象,本身都是會有一個虛函數表的,前者為自身創建的,后者為繼承,且虛函數表的指針位置位于類的首四位地址,如下圖所示!
如何獲取虛函數表地址?看下面代碼:
首先獲取類地址,將類地址強制轉為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 推測
為什么要共用同一個虛函數表?可能是為了節省內存吧,首先同一個類的對象虛函數都是一樣的,沒必要重新伴隨構造生成一份一模一樣的表,所以拷貝虛函數表的表地址就行。
總結
以上是生活随笔為你收集整理的类的不同实例化使用一张虚函数表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 落克王国经验计算机,洛克王国宠物经验计算
- 下一篇: python如何实现找图_python实