c++ 虛基類

首先,我們看一個類圖:


我們知道,如果一個派生類有多個直接基類,而這些直接基類又有一個共同的基類,則在最終的派生類中會保留該間接共同基類數據成員的多份同名成員。在引用這些同名的成員時,必須在派生類對象名後增加直接基類名,以避免產生二義性,使其惟一地標識一個成員。

在一個類中保留間接共同基類的多份同名成員,雖然有時是有必要的,可以在不同的數據成員中分別存放不同的數據,也可以通過構造函數分別對它們進行初始化。但在大多數情況下,這種現象是人們不希望出現的。因爲保留多份數據成員的拷貝,不僅佔用較多的存儲空間,還增加了訪問這些成員時的困難,容易出錯。而且在實際上,並不需要有多份拷貝。

C++提供虛基類(virtual base class)的方法,使得在繼承間接共同基類時只保留一份成員。假設類D是類B和類C公用派生類,而類B和類C又是類A的派生類,如圖11.21所示。 設類A有數據成員data和成員函數fun;派生類B和C分別從類A繼承了data和fun,此外類B還增加了自己的數據成員data_b,類C增加了數據成員data_c。如果不用虛基類,就會在類D中保留了類A成員data的兩份拷貝,分別表示爲int B::data和int C::data。同樣有兩個同名的成員函數,表示爲void B::fun()和void C::fun()。類B中增加的成員data_b和類C中增加的成員dat_c不同名,不必用類名限定。此外,類D還增加了自己的數據成員data_d和成員函數fun_d。

注意: 虛基類並不是在聲明基類時聲明的,而是在聲明派生類時,指定繼承方式時聲明的。因爲一個基類可以在生成一個派生類時作爲虛基類,而在生成另一個派生類時不作爲虛基類。

聲明虛基類的一般形式爲:
class 派生類名: virtual 繼承方式 基類名
即在聲明派生類時,將關鍵字 virtual 加到相應的繼承方式前面,經過這樣的聲明後,當基類通過多條派生路徑被一個派生類繼承時,該派生類只繼承該基類一次,也就是說,基類成員只保留一次。
注意:爲了保證虛基類在派生類中只繼承一次,應當在該基類的所有直接派生類中聲明爲虛基類。否則仍然會出現對基類的多次繼承。
通過以上這些分析,我們大概已經知道虛基類是什麼東西了,但是這並不是虛基類的全部知識點,還有以下需要了解

1 二義性問題的解決

2 虛基類的初始化問題

說明:不過這些問題的解決方案網上一大堆,相信讀者很容易就能搞定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章