C 菱形繼承

2021-08-01 22:16:43 字數 1230 閱讀 1884

在c++繼承體系中,有一類問題是永遠跑不掉的即菱形繼承問題。此類問題又被稱作鑽石繼承問題,只是一種較差的設計結構,剛好看到這個問題,特此總結一下。

先來看一下菱形繼承的基本結構

a和b從基類base中繼承,而d多重繼承於a,b。那就意味著d中會有base中的兩個拷貝。因為成員函式不體現在類的記憶體大小上,所以實際上可以看到的情況是d的記憶體分布中含有2組base的成員變數。

又因其結構與鑽石有幾分相似,又被稱作鑽石繼承。

輸出d的大小為8。若此時示例化d並呼叫base中的print成員函式就會出現二義性問題。

如何解決鑽石繼承問題中的二義性問題呢?通過使用虛繼承的手段可以保證d只存有基類base的乙份拷貝,虛繼承是一種機制,類通過虛繼承指出它希望共享虛基類的狀態。對給定的虛基類,無論該類在派生層次中作為虛基類出現多少次,只繼承乙個共享的基類子物件,共享基類子物件稱為虛基類。

class base ;

class a : virtual

public base;

class b: virtual

public base;

class d : public a, public b;

時間:在通過繼承類物件訪問虛基類物件中的成員(包括資料成員和函式成員)時,都必須通過某種間接引用來完成,這樣會增加引用定址時間(就和虛函式一樣),其實就是調整this指標以指向虛基類物件,只不過這個調整是執行時間接完成的。

空間:由於共享所以不必要在物件記憶體中儲存多份虛基類子物件的拷貝,這樣較之多繼承節省空間。

最後關於虛繼承物件的記憶體布局這篇博文講的很不錯可以作為參考。

c 菱形繼承

單繼承 乙個子類只有乙個父類時稱為單繼承 多繼承 乙個子類有兩個或者兩個以上時這個繼承關係為多繼承 菱形繼承是多繼承的一種特殊情況 在繼承中子類會繼承父類的所有的成員,可以看出菱形繼承有資料冗餘和二義性的問題。assistant中會有person的兩份資料。可以從上面看出來我們的assistant中...

C 菱形繼承

1 多重繼承的問題 在c 類的繼承中會遇到這樣乙個問題,乙個派生類有兩個或者兩個以上的基類,如同下面這種繼承情況 類c繼承了類a和類b,但是類a和類b裡面有著相同的成員變數,那麼類c在使用這個成員變數的時候就會出現二義性的問題,需要通過域成員運算子進行區分 class a a void displa...

C 菱形繼承

菱形繼承概念 1.兩個派生類繼承同乙個基類 2.又有某個類同時繼承著兩個派生類 這種繼承被稱為菱形繼承,或者鑽石繼承 舉個例子 菱形繼承問題 1.羊繼承了動物的資料,鴕同樣繼承了動物的資料,當羊駝使用資料時,就會產生二義性 2.羊駝繼承自動物的資料繼承了兩份,其實我們應該清楚,比如年齡這份資料我們只...