前天和大學室友吃燒烤,其中談到菱形繼承的問題,突然發現腦中對這個幾乎空白,所以晚上回來就上網搜了搜,言歸正傳,說到菱形繼承,就要說到虛繼承的概念,對於虛繼承,就是為了解決從不同途徑繼承來的同名的數據成員在內存中有不同的拷貝造成數據不一致問題,將共同基類設置為虛基類。這時從不同的路徑繼承過來的同名數據成員在內存中就只有一個拷貝,同一個函數名也只有一個映射。這樣不僅就解決了二義性問題,也節省了內存,避免了數據不一致的問題。
class 派生類名:virtual 繼承方式 基類名
virtual是關鍵字,聲明該基類為派生類的虛基類。
在多繼承情況下,虛基類關鍵字的作用范圍和繼承方式關鍵字相同,只對緊跟其后的基類起作用。
聲明了虛基類之后,虛基類在進一步派生過程中始終和派生類一起,維護同一個基類子對象的拷貝。
菱形繼承的結構如下:
A
------
/ \
----- ------
B C
----- ------
\ /
------
D
------
轉化為代碼形式
class A{}; //基類
class B:public A{};//子類
class C:public A{};
class D:public B,public C();
如上代碼中A,B,C,D就構成了一個菱形繼承,如果不用虛基類來實現菱形繼承就會導致模糊調用的現象,所謂模糊調用就是說在D的內存中會保留兩個基類A的對象,如何解決這個問題,利用虛基類就能很好的解決這個問題,即可改為
class B:virtual public A{};//子類
class C:virtual public A{};
這就是c++臭名昭著的菱形繼承現象,而java則沒有