1. 程式人生 > >虛擬繼承C++

虛擬繼承C++

虛擬 進一步 同名 關鍵字 class 成員初始化 說明 nbsp 繼承

C++中虛擬繼承的概念

為了解決從不同途徑繼承來的同名的數據成員在內存中有不同的拷貝造成數據不一致問題,將共同基類設置為虛基類。這時從不同的路徑繼承過來的同名數據成員在內存中就只有一個拷貝,同一個函數名也只有一個映射。這樣不僅就解決了二義性問題,也節省了內存,避免了數據不一致的問題。
class 派生類名:virtual 繼承方式 基類名
virtual是關鍵字,聲明該基類為派生類的虛基類。
在多繼承情況下,虛基類關鍵字的作用範圍和繼承方式關鍵字相同,只對緊跟其後的基類起作用。
聲明了虛基類之後,虛基類在進一步派生過程中始終和派生類一起,維護同一個基類子對象的拷貝。

C++虛擬繼承

◇概念:

C++使用虛擬繼承(Virtual Inheritance),解決從不同途徑繼承來的同名的數據成員在內存中有不同的拷貝造成數據不一致問題,將共同基類設置為虛基類。這時從不同的路徑繼承過來的同名數據成員在內存中就只有一個拷貝,同一個函數名也只有一個映射。

◇解決問題:

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

◇語法:

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

{

...//派生類成員聲明

};

◇執行順序

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

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

執行成員對象的構造函數,多個成員對象的構造函數按照申明的順序構造;

執行派生類自己的構造函數;

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

mark

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

在一個成員初始化列表中同時出現對虛基類和非虛基類構造函數的調用時,虛基類的構造函數先於非虛基類的構造函數執行。

◇因果:

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

虛擬繼承C++