目錄
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...