C 菱形繼承關係

2021-09-09 07:11:50 字數 1871 閱讀 6525

1、菱形繼承是什麼

答:乙個派生類有多個基類,多個基類又由同乙個類派生

2、菱形繼承有什麼問題

答:會讓高層的基類在底層的派生類中擁有多份成員,造成不合理

3、菱形繼承如何解決

答:利用虛繼承解決,在虛繼承中會在本來和儲存虛基類的地方儲存vbptr,

如果乙個類中有重複的虛基類,就會讓多個vbptr指向同乙個虛基類作用域。

4.錯誤的菱形繼承關係示例**:

#include using namespace std;

class a

;class b:public a

;class c:public a

;class d:public b, public c

;int main()

5.改進的菱形繼承關係,通過虛繼承實現

#include using namespace std;

class a //虛基類a

;class b:virtual public a //虛繼承,一種繼承方式

;class c:virtual public a

;class d:public b, public c

;int main()

6.普通繼承與虛繼承的關係圖

純虛函式:(1) 將成員函式宣告為virtual; (2) 後面加上 = 0;(3)純虛函式沒有函式體

純虛函式的作用:在許多情況下,在基類中不能對虛函式給出有意義的實現,而把它說明為純虛函式,它的實現留給其派生類去做,這就是純虛函式的作用。

抽象類:含有純虛函式的類叫做抽象類(又叫純虛類,介面類)。抽象類是為了抽象和設計實現的。抽象類不能例項化物件,強制要求派生類實現某個介面。

之所以要存在抽象類,最主要是因為它具有不確定因素。我們把那些類中的確存在,但是在父類中無法確定具體實現的成員函式稱為純虛函式。純虛函式是一種特殊的虛函式,它只有宣告,沒有具體的定義。抽象類中至少存在乙個純虛函式;存在純虛函式的類一定是抽象類。存在純虛函式是成為抽象類的充要條件。

class base  //抽象類(又叫介面類或純虛類);/*

class drive1 :public base;*/

class drive2 :public base

};class b : virtual public a

};class c :virtual public a

};class d : public b, public c

virtual void showc(){}

};/*

記憶體分配:

使用虛基類的記憶體關係圖

C 菱形繼承

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

c 菱形繼承

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

C 菱形繼承

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