C++对象内存布局--④VS编译器--单个虚拟继承
生活随笔
收集整理的這篇文章主要介紹了
C++对象内存布局--④VS编译器--单个虚拟继承
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C++對(duì)象內(nèi)存布局--④VS編譯器--單個(gè)虛擬繼承
在VS2005編譯器下,證明單個(gè)虛擬繼承的內(nèi)存布局:無(wú)論有無(wú)虛函數(shù),必然含有虛基類表指針。虛基類表中的內(nèi)容為本類實(shí)例的偏移和基類實(shí)例的相對(duì)偏移值。
?如果有虛函數(shù),那么基類的虛函數(shù)表跟派生類的虛函數(shù)表是分開的。
在內(nèi)存布局上,地址從低到高,順序如下:派生類的虛函數(shù)表指針,虛基類表指針,派生類的成員變量,基類的虛函數(shù)表指針,基類的成員變量。
也就是說(shuō)派生類在上,基類在下。這個(gè)跟普通的繼承相反。
特別說(shuō)明,GNU的GCC編譯器在處理虛擬繼承上跟VS有不同的地方。它的內(nèi)存布局是:派生類的虛函數(shù)表跟虛基類表合并,另外分析。
另外,發(fā)現(xiàn)如果派生類實(shí)現(xiàn)了基類的虛函數(shù),那么派生類對(duì)象,派生類和基類的實(shí)例之間會(huì)多出一個(gè)值為0的間隔。
//VS編譯器--單個(gè)虛擬繼承.cpp //2010.8.18 #include <iostream> using namespace std; // class Base {public:Base(int a = 10):a(a){cout << "Base::Base()" << endl;}virtual void show1(){cout << "Base::show1()" << endl;}private:int a; }; // class Derived : virtual public Base {public:Derived(int b = 100):b(b){cout << "Derived::derived()" << endl;}virtual void show2(){cout << "Derived::show2()" << endl;}private:int b; }; // int main() {Derived obj;int** p = (int**)&obj;typedef void (__thiscall *fun)(void*pThis);//非常重要cout << "虛擬繼承了基類的派生類的對(duì)象內(nèi)存布局:" <<endl;for (int i = 0; i != sizeof(obj)/4; ++i){cout << p[i] << endl;}cout << endl << "第一虛函數(shù)表第一項(xiàng),虛函數(shù)Derived::show2()地址:" << (int*)p[0][0] << endl;((fun)(p[0][0]))(p);cout << "第二虛函數(shù)表第一項(xiàng),虛函數(shù)Base::show1()地址 :" << (int*)p[3][0] << endl;((fun)(p[3][0]))(p+3);cout << endl << "虛基類表第一項(xiàng),本類對(duì)象地址 - 虛基類表指針地址 = " << (int*)p[1][0] << endl;cout << "虛基類表第二項(xiàng),基類對(duì)象地址 - 虛基類表指針地址 = " << (int*)p[1][1] << endl;system("pause");return 0; } /* Base::Base() Derived::derived() 虛擬繼承了基類的派生類的對(duì)象內(nèi)存布局: 0041C2F8 0041C2FC 00000064 0041C2F0 0000000A第一虛函數(shù)表第一項(xiàng),虛函數(shù)Derived::show2()地址:00401280 Derived::show2() 第二虛函數(shù)表第一項(xiàng),虛函數(shù)Base::show1()地址 :00401250 Base::show1()虛基類表第一項(xiàng),本類對(duì)象地址 - 虛基類表指針地址 = FFFFFFFC 虛基類表第二項(xiàng),基類對(duì)象地址 - 虛基類表指針地址 = 00000008 請(qǐng)按任意鍵繼續(xù). . . */總結(jié)
以上是生活随笔為你收集整理的C++对象内存布局--④VS编译器--单个虚拟继承的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到两只猫是什么意思解梦
- 下一篇: 梦到做梦是什么意思