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

2021-07-31 06:30:02 字數 2671 閱讀 7858

在c++語言中。,乙個派生類可以從乙個基類派生,也可以從多個基類派生。從乙個基類派生的繼承稱為單繼承,從多個基類派生的繼承稱為多繼承。繼承可以使**得到復用,子類還可以在父類的基礎上新增功能

c++繼承分為公有繼承,私有繼承,保護繼承三類

單繼承的定定義格式:

class 《派生類名》:《繼承方式》《基類名》

多繼承的定定義格式:

class 《派生類名》:《繼承方式1>《基類名1>,《繼承方式2>《基類名2>…

可見,多繼承與單繼承的區別從定義格式上看,主要是多繼承的基類數量上的區別,如果省略繼承方式,對『class』將採用私有繼承,對『struct』將採用公有繼承

公有繼承:

公有繼承的特點是基類的共有成員和保護成員作為派生類的成員的時候,他們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被派生類訪問。

私有繼承

私有繼承的特點是基類的共有成員和保護成員都作為派生類的私有成員,並且不能被這個派生類的子類所訪問。

保護繼承:

保護繼承的提誒那是接力的所有共有成員和保護成員都稱為派生類的保護成員,並且只能被它的派生類成員函式或者友元訪問,基類的私有函式仍然是私有的。

下面列出三種不同的繼承凡是的基類特性和派生類的特性

public

protected

privated

公有繼承

public

protect

不可見私有繼承

private

private

不可見保護繼承

protected

protected

不可見

為了進一步理解三種不同的繼承方式在其成員的可見性方面的區別,下面從三種不同角度進行討論。

公有方式

基類成員對其物件的可見性:公有成員可見,其他不可見。保護成員同私有成員。

基類成員對派生類的可見性:公有成員和保護成員可見,而私有成員不可見,保護成員同私有成員。

基類成員對派生類物件的可見性:公有成員可見,其他成員不可見。

所以,在公有繼承時,派生類的物件可以訪問基類中的公有函式;派生類的成員函式可以訪問基類的共有成員和保護成員。這裡,一定套區分清楚派生類的物件和派生類中的成員函式對基類的訪問時不同的。

私有方式

基類成員對其物件的可見性:公有成員可見,其他不可見。

基類成員對派生類的可見性:公有成員和保護成員可見,而私有成員不可見。

基類成員對派生類物件的可見性:所有成員都不可見。

所以,在私有繼承時,基類的成員只能由派生類中的成員訪問,而且不玩再往下繼承

保護方式

這種繼承方式與私有繼承情況相同,區別僅在於對派生類的成員而言,對基類成員有不同的可見性。

下面用乙個例項**來更加清晰的了解基類成員對其物件,對派生類,對派生類物件的可見性

#includeusing namespace std;

class

base

int a;

protected:

int b;

private:

int c;

}class derived1 : public

base

//公有繼承

}class derived2 : private

base

//私有繼承

}class derived3 : protected base

//保護繼承

class derived4 : public derived3//不能被private繼承的派生類的子類訪問

}class derivated5 : base

//預設是private繼承

}int main()

}

關於菱形繼承(虛繼承)

虛繼承是乙個基類(base)派生出兩個類(derived1,derived2)之後有乙個類(dderived)繼承derived1和derived2才使用的,如果按照原來的繼承進行,當需要呼叫到base類的成員的時候,編譯器會報錯,因為編譯器不知道是通過derived1去呼叫base還是通過derived2去呼叫

面對上面的問題,我們的解決辦法是

直接在dderived中需要base時,用乙個物件去指定是通過derived1還是derived2去呼叫base

但是這種方法存在缺陷,浪費了乙個derived的空間不說(冗餘),dderived存在兩個base成員(存在二義性問題),和需求不同,這個問題就比較嚴重了。

之後就引入了虛函式的概念

只需要在兩個derived1和derived2 定義時前面加上關鍵字virtual就變成了虛擬繼承

記憶體分布就變成:

derived1 虛表指標

derived1成員

derived2 虛表指標

derived2 成員

dderived 成員

base 成員

虛表指標裡面存放虛函式的位址,如果子類存在將父類的虛函式重寫,將會把這個函虛表可以繼承,如果子類沒有重寫虛函式,那麼子類虛表中仍然會有該函式的位址,只不過這個位址指向的是基類的虛函式實現。如果基類有3個虛函式,那麼基類的虛表中就有三項(虛函式位址),派生類也會有虛表,至少有三項,如果重寫了相應的虛函式,那麼虛表中的位址就會改變,指向自身的虛函式實現。如果派生類有自己的虛函式,那麼虛表中就會新增該項。

單繼承 多繼承 菱形繼承

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

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

一 單繼承 單繼承是一種 乙個子類只有乙個直接父類 的繼承關係。二 多繼承 多繼承是一種 乙個子類有兩個或兩個以上直接父類 的繼承關係。三 菱形繼承 菱形繼承由兩個 或以上 單繼承,乙個多繼承構成,結構如下 顯然,上例中assistant類多繼承了student和teacher兩個類,而studen...

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 ...