繼承(單繼承 多繼承 菱形繼承 虛繼承)

2021-08-10 19:54:39 字數 1882 閱讀 9632

一、單繼承

單繼承是一種

乙個子類只有乙個直接父類 的繼承關係。

二、多繼承

多繼承是一種

乙個子類有兩個或兩個以上直接父類 的繼承關係。

三、菱形繼承

菱形繼承由兩個(或以上)單繼承,乙個多繼承構成,結構如下:

顯然,上例中assistant類多繼承了student和teacher兩個類,而student和teacher兩個類又都單繼承了person類。其物件模型如下:

因此,在assistant的物件中,就會有兩份分別由student和teacher繼承來的person成員。也就是說,菱形繼承中存在二義性和資料冗餘問題。

#include

using namespace std;

class person ;

class student : public person ;

class teacher : public person ;

class assistant : public student,public teacher ;

void test()

四、虛繼承

虛繼承是為了

解決菱形繼承的二義性和資料冗餘問題

而設計的,其特點如下:

虛繼承解決了在菱形繼承體系裡子類物件包含多份父類物件的資料冗餘和空間浪費問題。

虛繼承體系看起來便複雜,在實際應用中我們通常不會定義如此複雜的繼承體系。

使用虛繼承會在解決資料冗餘問題的同時帶來效能上的損耗。

class student : virtual public person 和

class teacher : virtual public person 。如此定義後再在測試函式中執行

a._name="xiaoxu"; 就可以編譯通過,當然,利用

a.student::_name="xiaoxu"; 也可以編譯通過,只不過此時在student中對_name的改變,也會影響到teacher中的_name(一改全改)。

換個簡單的例子看一下虛繼承的實質:

可以看出,虛繼承在解決二義性時引入了偏移量,在找a時,利用其與虛基表指標的偏移量來進行。

(注:+4是因為型別都為int型)

需要注意的是:

1.在本例中,虛基表指標佔據了8個位元組的空間,同時為d節省了a的4個位元組的空間。

2.當a的空間夠大時,只用虛繼承是節省空間的。

3.sizeof(b)的結果是12而不是8,整個d的sizeof結果是4+8+8+4=20。

單繼承 多繼承 菱形繼承

乙個類繼承另外乙個類,那麼該類就是子類 衍生類 被繼承的這個類叫做父類 基類,超類 繼承 1 單繼承 2 多繼承 python所有的類都預設繼承父類 object 如果子類想呼叫父類私有的,要先在父類裡面定義乙個公有的,然後在公有的裡面先調出私有,最後就可以間接的調出私有,不能在子類中定義公有 cl...

C 多繼承 菱形繼承 虛繼承

b和c都單繼承了a d繼承了b和c 是多繼承 有兩個或兩個以上的基類就是多繼承 class a public int ma class b public a public int mb class c public a public int mc class d public b,public c ...

c 之各種繼承(單繼承,多繼承,菱形繼承)

在c 語言中。乙個派生類可以從乙個基類派生,也可以從多個基類派生。從乙個基類派生的繼承稱為單繼承,從多個基類派生的繼承稱為多繼承。繼承可以使 得到復用,子類還可以在父類的基礎上新增功能 c 繼承分為公有繼承,私有繼承,保護繼承三類 單繼承的定定義格式 class 派生類名 繼承方式 基類名 多繼承的...