在上一節中,有兩個身份證號顯然是不合理的。為此,可以把class person這個共同基類設定為虛基類,這樣,從不同路徑繼承來的同名資料成員在記憶體中就只有乙個拷貝,同名函式也只有一種對映。
虛基類(virtual base class)定義方式如下:
class 派生類名:virtual 訪問限定符 基類類名;
或:class 派生類名:訪問限定符 virtual 基類類名;
其中:virtual 關鍵字只對緊隨其後的基類名起作用。
例如://學生類定義:
class student::virtual public person;
//教職工類定義:
class employee::virtual public person;
採用虛基類後,在職研究生類物件的儲存如下圖所示。
與8.3節中的圖8.4(b)不同的是:在person的位置上放的是指標,兩個指標都指向person成員儲存的記憶體。這種繼承稱為虛擬繼承(virtual inheritance)。
在派生類物件的建立中,構造次序如下:
虛基類的建構函式被呼叫,並按它們宣告的順序構造;
非虛基類的建構函式按它們宣告的順序呼叫;
成員物件的建構函式;
派生類自己的建構函式被呼叫。
析構的次序與構造的次序相反。
【例8.3】在採用虛基類的多重繼承中,構造與析構的次序。 (檢視原始碼)
執行結果
constructor bclass3 //第乙個虛擬基類,與派生類析構函式排列無關
constructor bclass2 //第二個虛擬基類
constructor bclass1 //非虛擬基類
constructor object //物件成員
派生類建立!
主程式執行!
派生類析構!
deconstructor object //析構次序相反
deconstructor bclass1
deconstructor bclass2
deconstructor bclass3
【例8.4】虛基類在多層多重繼承中的應用——在職研究生類定義。(檢視原始碼)
大學在冊人員繼承關係如下圖所示:
圖 大學在冊人員繼承關係
採用虛基類的在職研究生類的多重繼承結構如下圖所示:
執行時可以看到,儘管employee和student的建構函式都包含person的建構函式,但並未真正呼叫。唯一的一次呼叫是在egstudent建構函式中。
C 虛基類詳解
1 虛基類的作用從上面的介紹可知 如果乙個派生類有多個直接基類,而這些直接基類又有乙個共同的基類,則在最終的派生類中會保留該間接共同基類資料成員的多份同名成員。在引用這些同名的成員時,必須在派生類物件名後增加直接基類名,以避免產生二義性,使其惟一地標識乙個成員,如 c1.a display 在乙個類...
C 虛繼承和虛基類詳解
多繼承 multiple inheritance 是指從多個直接基類中產生派生類的能力,多繼承的派生類繼承了所有父類的成員。儘管概念上非常簡單,但是多個基類的相互交織可能會帶來錯綜複雜的設計問題,命名衝突就是不可迴避的乙個。多繼承時很容易產生命名衝突,即使我們很小心地將所有類中的成員變數和成員函式都...
C 虛繼承和虛基類詳解
多繼承 multiple inheritance 是指從多個直接基類中產生派生類的能力,多繼承的派生類繼承了所有父類的成員。儘管概念上非常簡單,但是多個基類的相互交織可能會帶來錯綜複雜的設計問題,命名衝突就是不可迴避的乙個。多繼承時很容易產生命名衝突,即使我們很小心地將所有類中的成員變數和成員函式都...