在繼承時,如果乙個派生類d,從幾個基類中繼承來,如f1,f2(假設有兩個類,也許有更多),而這些基類又繼承自同乙個基類m,那麼在d中就會有關於m的雙重拷貝,在d的物件中,如果使用成員或者函式,就要使用作用域識別符號來辨別該變數或者函式來自f1 or f2. 虛基類使得d中關於m的雙重拷貝可以在d中只存放乙份.舉個列子
示例**如下:
如果不加入virtual 會報下面的錯誤:
如果不加入virtual 那麼必須加入作用域識別符號**如下:
關於public、protect、private關鍵字的用法:
public 宣告的變數成員函式可以訪問,類的物件也可以訪問
public 方式的繼承: 基類中公有變數和函式、保護變數和函式在子類中仍然是公有和保護型的,子類不能訪問基類的私有變數和函式
protect 宣告的變數,在該類中成員函式可以訪問,類的物件不能訪問
protect 方式的繼承:基類中公有變數和函式、保護變數和函式在子類中變成保護型的,子類不能訪問基類的私有變數和函式
private 宣告的變數,在該類中成員函式可以訪問,類的物件不能訪問
private 方式的繼承:基類中公有變數和函式、保護變數和函式在子類中變成私有型的,子類不能訪問基類的私有變數和函式
protect 方式繼承和private 方式繼承的不同:
假設b以private 方式繼承a,b作為基類以private 方式被c繼承,那麼a中公有和保護型變數和函式在b中全部變成私有的,在c以private 方式繼承b時,c只能繼承來自b中的public和protected 型別的變數和函式,a中的變數和函式c繼承不到.
假設b以protected 方式繼承a,那麼a中的公有和保護變數及成員函式在b中以protected 形式存在,在b 被c以protected 或者private 方式繼承時,c只能繼承來自b中的public和protected 型別的變數和函式,其中包含了b從a繼承的變數和函式.
關於派生類初始化基類的建構函式的順序問題(派生類建構函式執行的一般次序問題):
(1)呼叫基類建構函式,呼叫順序按照繼承時的順序從左到右
(2)呼叫內嵌成員物件的建構函式,呼叫順序按照它們在類中的宣告順序
(3)派生類的建構函式體中的內容
例項**如下:
虛基類及其派生類建構函式:
我們將建立物件時所指定的類稱為當時的最遠派生類.
例如該文章中建立d類的物件d就是最遠派生類
建立乙個物件時,如果這個物件含有從虛基類繼承來的成員,則虛基類的成員是由最遠派生類的建構函式通過呼叫虛基類的建構函式進行初始化的,而且只有最遠派生類的建構函式可以對虛基類的建構函式進行初始化工作,該派生類的其他基類的建構函式對虛基類的建構函式的初始化呼叫自動忽略,以本文中第乙個圖舉例,m類中的成員是通過d類的建構函式進行初始化的,而不是通過f1、f2的建構函式進行初始化的。具體的例子見:p235,c++ 語言程式設計(第三版)
C 的虛基類
虛基類 當在多條繼承路徑上有乙個公共的基類,在這些路徑中的某幾條匯合處,這個公共的基類就會產生多個例項 或多個副本 若只想儲存這個基類的乙個例項,可以將這個公共基類說明為 虛基類 虛基類.在繼承中產生歧義的原因有可能基類是繼承類繼承了基類多次,從而產生了多個拷貝,即不止一次的通過多個路徑繼承類在記憶...
C 虛基類詳解
在上一節中,有兩個身份證號顯然是不合理的。為此,可以把class person這個共同基類設定為虛基類,這樣,從不同路徑繼承來的同名資料成員在記憶體中就只有乙個拷貝,同名函式也只有一種對映。虛基類 virtual base class 定義方式如下 class 派生類名 virtual 訪問限定符 ...
C 虛基類詳解
1 虛基類的作用從上面的介紹可知 如果乙個派生類有多個直接基類,而這些直接基類又有乙個共同的基類,則在最終的派生類中會保留該間接共同基類資料成員的多份同名成員。在引用這些同名的成員時,必須在派生類物件名後增加直接基類名,以避免產生二義性,使其惟一地標識乙個成員,如 c1.a display 在乙個類...