1樓:匿名使用者
這是因為虛繼承會生成一個虛基表(vbtable)指標vbptr,其中指標vbptr指向虛基表vbtable。
虛基表記錄了類相對於指標vbptr在物件中的偏移量。
虛繼承時,虛基類指標vbptr指向虛基類表vbtable,虛基類表中存放的就是資料相對於虛基類指標的偏移,從而根據偏移找到資料。
在vbtable中:
0:當前最近作用域的偏移(vbptr的偏移)
1:虛繼類資料的起始偏移(vbptr的偏移)
在vs中檢視類的記憶體佈局:
方法1:在vs中,專案->屬性->c/c++->命令列中新增/d1reportallclasslayout即可檢視這兩個類的記憶體分佈情況。
方法2:在vs中,工具->visual studio 命令提示,然後用cd命令切換到cpp檔案的目錄,按照你的cpp檔案為【源.cpp】,具體方法如下:
cl 源.cpp /d1reportallclasslayout
然後就可以看到類的記憶體分佈了,附上我的測試圖(一樣的**):
類father和類son1的記憶體分佈
也可以在vs的監視視窗看看程式執行時的記憶體情況。
2樓:匿名使用者
難道是因為多了一個虛繼承表指標?
c++中虛繼承和一般的繼承有什麼不同
3樓:隨意之歌
虛繼承不管父類派生出多少個子類在記憶體總只存在一套資料,但是一般繼承會存在與派生類個數對應的n個資料(n為派生類個數)
c++帶虛擬函式的虛繼承
4樓:du知道君
1、對比兩個所謂的空類:
class m
};class n
};在常用的編譯器下,sizeof(m)是1,sizeof(n)是4。這是由於m中無資料成員,但是為了確保記憶體空間的唯一性,編譯器會給m中新增一個隱含的char型別;n是4這個解釋起來比較複雜,簡單說是為了實現虛擬函式,編譯器會在含有虛擬函式的類裡新增一個一般稱為vptr指標,這個指標指向虛擬函式表。
2、b和c沒有新增任何資料成員,僅僅override函式,所有大小不變。
3、虛擬繼承理解起來要複雜的多,這個例子也沒有涉及到。
在網上進行了付費諮詢,為什麼看不到律師給我的解答?
很有可能你遇到 了,對方就算收了你的錢,也不會給你解答,所以在選擇律師諮詢的時候,一定要到專業正規的律師事務所,最好不要在網上。我在網上看到自貢律師團隊免費諮詢,點進去叫我付元,我付款後沒見回覆,我問怎麼回事?又叫我付元,我感覺是一群 在網上騙錢,希望司法部門給予打擊。可能是因為律師比較忙,還沒有來...
好友卡隆一文抓住卡隆的什麼特點進行了傳神的描寫?試舉一例
抓住了卡隆滑稽的外貌和助人為樂的特點來寫的 學霸,幫我。是關於好友卡隆 卡隆,你性格開朗,待人真誠,認真負責善於溝通 協調有較強的組織能力與團隊精神 活潑開朗 樂觀上進 有愛心並善於施教並行 上進心強 勤於學習,專業知識紮實,自學能力很強,能不斷進步自身的能力與綜合素質。 我認為卡隆是一個非常善良的...
為什麼我電腦記憶體佔用很高,為什麼我的膝上型電腦記憶體佔用特別高?
哈哈親愛的 電腦記憶體佔用很高,出現這種情況,一般有以下幾點原因 1 防防毒軟體造成故障 由於新版的kv 金山 瑞星都加入了對網頁 外掛 郵件的隨機監控,無疑增大了系統負擔。處理方式 基本上沒有合理的處理方式,儘量使用最少的監控服務吧,或者,升級自己的硬體配備。2 驅動沒有經過認證,造成cpu資源佔...