深度剖析虛擬繼承

2021-08-09 03:20:20 字數 975 閱讀 5474

虛擬繼承函式與普通繼承

class base

;class p :public base

;class x :virtual public base

;int main()

普通繼承

虛擬繼承

普通繼承與虛擬繼承的區別:

1.書寫形式不同

虛擬繼承含關鍵字virtual。

2.物件模型不同

虛擬繼承多了4個位元組,這四個位元組儲存偏移量**的位址。

偏移**存放內容:物件相對於自己的偏移量

物件相對於基類成員的偏移量

3.在記憶體中,普通繼承基類部分在前,派生類部分在後;

虛擬繼承基類部分在後,派生類部分在前。

4.訪問方式不同

普通繼承函式:直接訪問

5.建構函式不同

①虛擬繼承的派生類合成建構函式,將偏移量**的位址放在物件的前四個位元組;

②push 1;多了乙個引數1,用來區分是否為虛函式。

菱形虛擬繼承

但是虛擬繼承也存在一些缺陷,間接訪問,效率低。

菱形虛擬繼承的深入剖析

繼承是物件導向語言的一大特性,在c 中既有單繼承,當然也會存在多繼承。那麼多繼承是怎麼實現的及多繼承的一些缺點,將是這篇部落格想要說的內容。多繼承最典型的乙個例子就是菱形繼承,那什麼又是菱形繼承呢?就是有兩個子類分別繼承乙個父類,而有存在乙個子類同時這兩個子類。圖示如下。當我們模擬出菱形繼承想給a賦...

ifdef cplusplus深度剖析

時常在cpp的 之中看到這樣的 ifdef cplusplus extern c endif 這樣的 到底是什麼意思呢?首先,cplusplus是cpp中的自定義巨集,那麼定義了這個巨集的話表示這是一段cpp的 也就是說,上面的 的含義是 如果這是一段cpp的 那麼加入extern c 處理其中的 ...

深度剖析ostream

雖然c 學了大半個月了,自己學了解了很多關於c 的知識,大的概念懂了不少,但是還是想說想要徹底的弄懂c 絕非易事。當別人問到乙個很小的知識點些許你都要愣很久,事實告訴我們不能太好高騖遠。為什麼要寫ostream而不是istream,因為當我們自定義型別 student類 的時候,如果需要輸出 stu...