多重繼承
A.橫向多重繼承:
B.縱向多重繼承:
C.聯合多重繼承:
因為 single 和 waiter 都繼承了一個 worker 組件,因此 SingingWaiter 將包含兩個 worker 組件,那么將派生類對象的地址賦給基類指針將出現二義性
那么如何解決二義性問題呢?我們知道程序的執行一定是具有確定性的,在上述情況下,我們能想到的是進行強制轉換,如下所示:
很顯然,上述這種強制轉換確實能夠解決因聯合繼承帶來的二義性問題,但是每次都進行這樣的強制轉換過于繁瑣,那么有沒有簡單的辦法解決二義性問題呢?答案就是:虛繼承,所謂的虛繼承,就是讓共享一個祖父類
虛繼承
A.What(什么是虛繼承、虛基類)
- 虛繼承:
class Derived: public virtual Base, 如下例所示,展示了虛繼承的形式
- 虛基類
被聲明為虛繼承的基類被稱為虛基類
B.Why(虛繼承的作用)
- 解決二義性沖突:當基類的指針指向孫子類的指針或引用時,會出現二義性,因為 孫子類對象包含多個祖父類對象,而虛繼承只保留一個共享的祖父類
- 減少內存消耗:因為孫子類只包含一個祖父類對象
- 減少代碼冗余:虛基類的成員只需在最終的派生類中定義一次