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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++对象内存布局--④VS编译器--单个虚拟继承

發(fā)布時(shí)間:2023/11/29 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。