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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

对象内存布局 (5)

發布時間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对象内存布局 (5) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

內容概要:

滿足下面3個條件時,

1. 父類有虛函數,子類也有虛函數,且子類的虛函數重寫或覆蓋了父類的虛函數

2. 非虛繼承

3. 多重繼承

類對象之內存布局

多重繼承,派生類不重寫基類中的虛函數。

假定各類之間的關系如下圖:

???

代碼如下:

#include <iostream> using namespace std;class Base1 { public:int m_base1;inline virtual void vfBase1_1(){cout << "This is in Base1::vfBase1_1()" << endl;}inline virtual void vfBase1_2(){cout << "This is in Base1::vfBase1_2()" << endl;} }; class Base2 { public:int m_base2;inline virtual void vfBase2_1(){cout << "This is in Base2::vfBase2_1()" << endl;}inline virtual void vfBase2_2(){cout << "This is in Base2::vfBase2_2()" << endl;} }; class Base3 { public:int m_Base3;inline virtual void vfBase3_1(){cout << "This is in Base3::vfBase3_1()" << endl;}inline virtual void vfBase3_2(){cout << "This is in Base3::vfBase3_2()" << endl;} }; class Derived : public Base1, public Base2, public Base3 { public:int m_derived;inline virtual void fd(){cout << "This is in Derived::fd()" << endl;} }; typedef void (*VFun)(void); template<typename T> VFun virtualFunctionPointer(T* b, int i) {return (VFun)(*((int*)(*(int*)b) + i)); } int main(void) {Derived d;cout << "The size of Derived object = \t" << sizeof(Derived) << endl;cout << endl;cout << "1st virtual function table: " << endl;int i = 0;while(virtualFunctionPointer(&d, i)&&i<3){VFun pVF = virtualFunctionPointer(&d, i++);pVF();}cout << endl;cout << "2nd virtual function table: " << endl;i = 0;//以32字長的機器,找到下一個繼承base class的vptrint* tmp = ((int*)&d)+ sizeof(Base1)/4;//虛函數表中的虛函數后面不為NULL?如果不加i的限制會出現段錯誤,不能結束循環while(virtualFunctionPointer(tmp, i)&&i<2){VFun pVF = virtualFunctionPointer(tmp, i++);pVF();}cout << endl;cout << "3rd virtual function table: " << endl;i = 0;tmp = ((int*)&d) +(sizeof(Base1)+sizeof(Base2))/4;while(virtualFunctionPointer(tmp, i)&&i<2){VFun pVF = virtualFunctionPointer(tmp, i++);pVF();}return 0; }

運行結果:

Derived對象之memory layout如下:

?

?(表中的Base::vfBase1_1應該是Base1::vfBase1_1,其余的類推)

由上面的分析可知:

其一:有三個虛函數表

其二:在Derived類中定義的虛函數Derived::vfDerived()附加在一個虛函數表的最后

?(注意:多重繼承有多個虛函數表)

轉載于:https://www.cnblogs.com/wuchanming/p/4091164.html

總結

以上是生活随笔為你收集整理的对象内存布局 (5)的全部內容,希望文章能夠幫你解決所遇到的問題。

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