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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++虚继承下的内存模型(一)

發(fā)布時間:2025/4/5 c/c++ 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++虚继承下的内存模型(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

簡單的面向對象,只有單繼承或多繼承的情況下,內存模型很好理解,編譯器實現(xiàn)起來也容易,C++ 的效率和 C 的效率不相上下。一旦和 virtual 關鍵字扯上關系,使用到虛繼承或虛函數(shù),內存模型就變得混亂起來,各種編譯器的實現(xiàn)也不一致,讓人抓狂。

這是因為 C++ 標準僅對 C++ 的實現(xiàn)做了框架性的概述,并沒有規(guī)定細節(jié)如何實現(xiàn),所以不同廠商的編譯器在具體實現(xiàn)方案上會有所差異。

本節(jié)我們只關注虛繼承時的內存模式,有關虛函數(shù)的內容將在《C++虛函數(shù)詳解》一節(jié)中講解。

對于普通繼承,基類子對象始終位于派生類對象的前面(也即基類成員變量始終在派生類成員變量的前面),而且不管繼承層次有多深,它相對于派生類對象頂部的偏移量是固定的。請看下面的例子:

class A{ protected:int m_a1;int m_a2; }; class B: public A{ protected:int b1;int b2; }; class C: public B{ protected:int c1;int c2; }; class D: public C{ protected:int d1;int d2; }; int main(){A obj_a;B obj_b;C obj_c;D obj_d;return 0; }

obj_a、obj_b、obj_c、obj_d 的內存模型如下所示:

A 是最頂層的基類,在派生類 B、C、D 的對象中,A 類子對象始終位于最前面,偏移量是固定的,為 0。b1、b2 是派生類 B 的新增成員變量,它們的偏移量也是固定的,分別為 8 和 12。c1、c2、d1、d2 也是同樣的道理。

前面我們說過,編譯器在知道對象首地址的情況下,通過計算偏移來存取成員變量。對于普通繼承,基類成員變量的偏移是固定的,不會隨著繼承層級的增加而改變,存取起來非常方便。

總結

以上是生活随笔為你收集整理的C++虚继承下的内存模型(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

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