C 繼承,虛繼承 記憶體結構 詳解

2022-09-24 12:54:11 字數 1523 閱讀 1197

目錄

class test1

private:

int num1;

};class test2 : public test1

private:

int num2;

};void main()

(test2記憶體結構)檢視記憶體發現父類在子類的上面

在原有的**基礎上增加了test3類

test3類繼承了 test2和test1

class test1

private:

int num1;

};class test2

private:

int num2;

};class test3 :public test2 ,public test1

private:

int num3;

};void main()

(test3記憶體位址 ) 依舊是父類在子類上

但是現在有兩個父類為什麼test2在test1上?

這和我們的繼承順序有關 我們先繼承了test2又繼承了test1 更換記憶體繼承順序 記憶體的情況也會有所變化

class test1

private:

int nuofcpqgm1;

};class test2: virtual public test1

private:

int num2;

};void main()

(t2的記憶體) 我們發現虛繼承以後父類成員資料在子類成員資料下面了 首位址處莫名其妙多www.cppcns.com了四位元組

這四位元組就是我們的虛基類表的位址

跟隨虛繼承表 其中儲存了本類距離父類物件的差值 通過差值能夠找到父類物件

我們再看這個記憶體0x0082fbd8是t2的首位址 0x0082fbe0是父類的位置

0x0082fbd8 - 0x0082fbe0 == 8

就是本類距離父類物件的差值

class 程式設計客棧test1

private:

int num1;

};class test2: virtual public test1

pri程式設計客棧vate:

int num2;

};class test3 :virtual public test1

private:

int num3;

};class test4 :public test2, public test3

private:

int num4;

};void main()

test4的記憶體 我們看到 t2和t3都有自己的虛基類表位址 記錄了自己和父類的偏移

兩個虛基類表的內容

現在我們計算一下 到爺爺類的差值是否正確

0x00fafd50 - 0x00fafd3c == 14

0x00fafd50 - 0x00fafd44 == c

本文標題: c++ 繼承,虛繼承(記憶體結構)詳解

本文位址: /ruanjian/c/425313.html

c 虛繼承詳解

include using namespace std class a class b public virtual a class c public virtual a virtual void t int main virtual void foo void int x a 很簡單 乙個虛表指標...

C 虛繼承和虛繼承

虛繼承是在多繼承中為了解決衝突而技術。學術一點來說,是指乙個指定的基類,在繼承體系結構中,將其成員資料例項共享給也從這個基類直接或間接派生的其他類。虛繼承非常有用,可以避免多繼承的歧義和多重拷貝。考慮有如下繼承結構。b和c繼承a,d多繼承b c,我們看以下 class a class b publi...

C 多重繼承 虛繼承

c 中的多繼承,建構函式處理並沒有問題,物件構造的時候按照繼承中宣告的順序呼叫多個父類的建構函式,析構函式同樣遵守單繼承中的原則。二意性問題 如果多基類中存在同名成員,會產生二意性的問題 比如,root1類中宣告doany 介面,root2類中也宣告了doany 介面,child多承繼root1和r...