懶博主終于上線啦!今天要和大家分享的是關(guān)于菱形虛擬繼承和菱形繼承的一些看法。
關(guān)于菱形虛擬繼承,大家都知道,通常情況下由于c++允許多繼承而形成的菱形繼承會導(dǎo)致二義性和數(shù)據(jù)冗余,舉個栗子吧!

菱形繼承

一個菱形繼承模型
如上圖所示的一般菱形繼承中,二義性出現(xiàn)在manage類中_name上,無法確定_name成員到底是屬于work類還是message類;而在manage類中可能存在work類和message類的_name成員的值相等的情況,即manage類中有兩個含義相同的量,這就導(dǎo)致了數(shù)據(jù)冗余。
為了解決菱形繼承的二義性和數(shù)據(jù)冗余,我們使用虛繼承。利用上面的栗子我們可以簡略的從代碼上區(qū)別菱形繼承和菱形虛擬繼承:

為了探索虛擬繼承為啥可以解決二義性和數(shù)據(jù)冗余,我們從主觀的監(jiān)視窗口和內(nèi)存管理分別區(qū)分如下:

監(jiān)視窗口對比圖


內(nèi)存管理對比圖
由上圖可知,虛擬繼承把具有二義性的成員用指向存放該位置到存儲成員數(shù)據(jù)位置的偏移量的指針來代替原成員數(shù)據(jù),并把具有二義性的成員數(shù)據(jù)放在類中其他成員數(shù)據(jù)之后。此時成員就不再具有二義性,類中只有一份成員數(shù)據(jù),不存在相同成員含義的兩分?jǐn)?shù)據(jù),因此也就不會存在二義性和數(shù)據(jù)冗余問題了。
今天的分享就到這里了!再會!
新聞熱點
疑難解答