对象内存布局 (5)
生活随笔
收集整理的這篇文章主要介紹了
对象内存布局 (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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Centos7 下yum安装mysql
- 下一篇: 第一次作业:准备