繼承jpanel不顯示 C 多繼承

2021-10-11 20:34:27 字數 1732 閱讀 1237

25.多繼承

25.1 多繼承的概念

c++中乙個類可以從多個基類中派生(即可以有多個父類),這就是多繼承。

簡單的多繼承方式是:派生類有兩個或以上的基類,基類之間沒有什麼關係。

上圖定義了兩個基類basea和baseb,然後再定義乙個派生類derive,讓這個類公開繼承兩個基類。

執行程式結果顯示程式先呼叫了basea的建構函式,然後呼叫了baseb的建構函式,最後又呼叫了派生類的建構函式。

多繼承下的派生類會擁有所有基類中的資料和函式。如果基類中的成員是是用protected標記的,那派生類可以直接訪問這些成員。

複雜的多繼承方式是:派生類的基類之間有繼承關係。

上圖中的b類和c類分別派生自a類,然後又定義乙個派生自b類和c類的d類,由於b類和c類有共同的基類a,所以繼承關係變得複雜了。

25.2 多繼承帶來的問題

上面的例子執行後,結果如下圖:

我們會發現在例項化乙個d類的物件時,基類a的建構函式被呼叫了2次,b類和c類的建構函式分別被呼叫了1次。這就會產生乙個問題:d類的物件同時包含兩個了2個a類的對。這是怎麼回事呢?然而問題還沒有結束,在嘗試想通過d類的物件設定price的值時,會發現函式呼叫報錯了。

原來b類和c類都繼承自a類,兩個類中都有price屬性,也都有setprice()和getprice()函式,在d類中使用這些屬性和方法時,系統不確定你想呼叫的是d的哪個父類的成員函式。所以通過d物件呼叫setprice()和getprice()函式時會歧義的,稱為多繼承函式呼叫的「二義性」。

如何解決二義性的問題?如下圖可以使用完全限定名(即加上類的作用域)的方式。

25.3 虛繼承

在構造乙個d類的物件時,a類被構造了兩次,也就是說d的物件中含有兩個a類物件,這是不合理的。因為d類的物件只需要乙個基類的物件就夠了,所以在多繼承中引入虛繼承的概念可以解決這個問題。

上圖中讓b類和c類虛繼承a類,只要在繼承中使用virtual關鍵字就可以。重新修改d的建構函式實現,把引數遞給a類的建構函式。

這樣再次執行程式,結果顯示a的建構函式只被呼叫了1次。

在程式設計中最好不要出現多繼承,如果需要多繼承時,可以把類的繼承關係設計為乙個基類和多個只包含功能作為介面的抽象類。

C 多繼承 虛繼承

一,多繼承 include include using namespace std class b1 繼承類c void main 主函式 c類按照順序繼承b2,b1,b4,b3 再按照資料成員定義順序 memberb1,memberb4,memberb3,memberb2 最後是自己的構造器 二,...

C 多繼承 多重繼承

派生類都只有乙個基類,稱為單繼承。除此之外,c 也支援多繼承,即乙個派生類可以有兩個或多個基類。多繼承的語法也很簡單,將多個基類用逗號隔開。例如已宣告了類a 類b和類c,那麼可以這樣來宣告派生類d class d public a,private b,protected c d 是多繼承形式的派生類...

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