虛擬繼承函式與普通繼承
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...