虛擬繼承C

2022-05-30 11:09:10 字數 1642 閱讀 4856

c++中虛擬繼承的概念

為了解決從不同途徑繼承來的同名的資料成員在記憶體中有不同的拷貝造成資料不一致問題,將共同基類設定為虛基類。這時從不同的路徑繼承過來的同名資料成員在記憶體中就只有乙個拷貝,同乙個函式名也只有乙個對映。這樣不僅就解決了二義性問題,也節省了記憶體,避免了資料不一致的問題。

class 派生類名:virtual 繼承方式 基類名

virtual是關鍵字,宣告該基類為派生類的虛基類。

在多繼承情況下,虛基類關鍵字的作用範圍和繼承方式關鍵字相同,只對緊跟其後的基類起作用。

宣告了虛基類之後,虛基類在進一步派生過程中始終和派生類一起,維護同乙個基類子物件的拷貝。

c++虛擬繼承

◇概念:

c++使用虛擬繼承(virtual inheritance),解決從不同途徑繼承來的同名的資料成員在記憶體中有不同的拷貝造成資料不一致問題,將共同基類設定為虛基類。這時從不同的路徑繼承過來的同名資料成員在記憶體中就只有乙個拷貝,同乙個函式名也只有乙個對映。

◇解決問題:

解決了二義性問題,也節省了記憶體,避免了資料不一致的問題。
◇同義詞:
虛基類(把乙個動詞當成乙個名詞而已)
當在多條繼承路徑上有乙個公共的基類,在這些路徑中的某幾條匯合處,這個公共的基類就會產生多個例項(或多個副本),若只想儲存這個基類的乙個例項,可以將這個公共基類說明為虛基類。
◇語法:

class 派生類: virtual 基類1,virtual 基類2,...,virtual 基類n

...//派生類成員宣告

◇執行順序

首先執行虛基類的建構函式,多個虛基類的建構函式按照被繼承的順序構造;

執行基類的建構函式,多個基類的建構函式按照被繼承的順序構造;

執行成員物件的建構函式,多個成員物件的建構函式按照申明的順序構造;

執行派生類自己的建構函式;

析構以與構造相反的順序執行;

mark

從虛基類直接或間接派生的派生類中的建構函式的成員初始化列表中都要列出對虛基類建構函式的呼叫。但只有用於建立物件的最派生類的構造函式呼叫虛基類的建構函式,而該派生類的所有基類中列出的對虛基類的建構函式的呼叫在執行中被忽略,從而保證對虛基類子物件只初始化一次。

在乙個成員初始化列表中同時出現對虛基類和非虛基類建構函式的呼叫時,虛基類的建構函式先於非虛基類的建構函式執行。

原來,c++的規則是:如果在繼承鏈上存在虛繼承的基類,則最底層的子類要負責完成該虛基類部分成員的構造。我們可以顯式呼叫虛基類的建構函式完成初始化。如果不顯式呼叫虛基類的建構函式,則編譯器會呼叫虛基類的預設建構函式。如果不顯式呼叫虛基類的建構函式,而虛基類沒有定義預設建構函式,則會出現編譯錯誤。這條規則的原因是:如果不這樣做,則虛基類部分會在存在的多個繼承鏈條上被多次初始化。

很多時候,對於繼承鏈上的中間類,我們也會在其建構函式中顯式呼叫虛基類的建構函式,因為一旦有人要建立這些中間類的物件,我們也要保證它們得到正確的初始化。

◇因果:

多重繼承->二義性->虛擬繼承解決

C 虛擬繼承

就是為了解決面相物件中繼承結構中可怕的菱形結構 下面是別人的,看看就懂了。從意義上來看,乙個sleepersofa沒有沙發和床兩種重量,如此的繼承不是真實的現實世界描述。進一步分析可得,床和沙發都是家具的一種,凡家具都有重量,所以通過分解來考察其關係,如圖17 2所示。圖17 2 床和沙發的分解 c...

C 虛擬繼承

就是為了解決面相物件中繼承結構中可怕的菱形結構 下面是別人的,看看就懂了。從意義上來看,乙個sleepersofa沒有沙發和床兩種重量,如此的繼承不是真實的現實世界描述。進一步分析可得,床和沙發都是家具的一種,凡家具都有重量,所以通過分解來考察其關係,如圖17 2所示。圖17 2 床和沙發的分解 c...

C 虛擬繼承

4.3 隱藏 是指派生類的函式遮蔽了與其同名的基類函式,特徵是 1 如果派生類的函式與基類的函式同名,但是引數不同,此時,不論有無virtual關鍵字,基類的函式將被隱藏 注意別與過載混淆 2 如果派生類的函式與基類的函式同名,但是引數相同,但是基類函式沒有virtual 關鍵字。此時,基類的函式被...