c 菱形繼承

2021-09-25 02:46:21 字數 1695 閱讀 7435

單繼承:乙個子類只有乙個父類時稱為單繼承

多繼承:乙個子類有兩個或者兩個以上時這個繼承關係為多繼承

菱形繼承是多繼承的一種特殊情況

在繼承中子類會繼承父類的所有的成員,可以看出菱形繼承有資料冗餘和二義性的問題。assistant中會有person的兩份資料。

可以從上面看出來我們的assistant中的sizeof(assistant)為20,但是現在我們的teacher和student都為8,這樣可以看出來assistant繼承出兩個person中的物件。

解決辦法:對於菱形繼承中解決辦法是使用虛繼承。繼承時使用virtual關鍵字,就可以保證我們的資料只有乙份,不會產生資料的二義性。

#include #include using namespace std;

class person;

class student :virtual public person;

class teacher : virtual public person;

class assistant :public teacher, public student;

void test()

int main()

產生的結果是:

但是為什麼使用虛繼承會導致我們的sizeof變大呢?這就跟虛擬繼承本質相關。

虛繼承的原理

虛擬繼承就是在虛擬繼承時生成一張虛基表,

使用vs進行除錯

可以看出我們的assistant是在虛繼承的上面,teacher中多出了乙個虛基表指標,這個指標指向的就是虛基表虛基表中存放的是偏移量,通過偏移量就可以找到person。

這樣就可以知道為什麼sizeof(assistant)的大小是20了。這也是虛基表指標實現虛繼承的原理。

C 菱形繼承

在c 繼承體系中,有一類問題是永遠跑不掉的即菱形繼承問題。此類問題又被稱作鑽石繼承問題,只是一種較差的設計結構,剛好看到這個問題,特此總結一下。先來看一下菱形繼承的基本結構 a和b從基類base中繼承,而d多重繼承於a,b。那就意味著d中會有base中的兩個拷貝。因為成員函式不體現在類的記憶體大小上...

C 菱形繼承

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

C 菱形繼承

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