久久亚洲精品成人_国产精品欧美综合亚洲_亚洲va天堂va欧美ⅴa在线_91色视频在线观看_久久影院亚洲_一级黄色片播放_日韩av在线一区_精品一区二区在线看_老头吃奶性行交视频_日韩免费高清视频_天天操天天爽天天干_日本欧美在线视频

首頁 > 編程 > C++ > 正文

深入解析C++中類的多重繼承

2020-05-23 14:14:14
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了深入解析C++中類的多重繼承,包括多重繼承相關的二義性問題,需要的朋友可以參考下

C++類的多繼承

在前面的例子中,派生類都只有一個基類,稱為單繼承。除此之外,C++也支持多繼承,即一個派生類可以有兩個或多個基類。

多繼承容易讓代碼邏輯復雜、思路混亂,一直備受爭議,中小型項目中較少使用,后來的 Java、C#、PHP 等干脆取消了多繼承。想快速學習C++的讀者可以不必細讀。

多繼承的語法也很簡單,將多個基類用逗號隔開即可。例如已聲明了類A、類B和類C,那么可以這樣來聲明派生類D:

 

 
  1. class D: public A, private B, protected C{ 
  2. //類D新增加的成員 

D是多繼承的派生類,它以共有的方式繼承A類,以私有的方式繼承B類,以保護的方式繼承C類。D根據不同的繼承方式獲取A、B、C中的成員,確定各基類的成員在派生類中的訪問權限。

多繼承下的構造函數

多繼承派生類的構造函數和單繼承類基本相同,只是要包含多個基類構造函數。如:

 

 
  1. D類構造函數名(總參數表列): A構造函數(實參表列), B類構造函數(實參表列), C類構造函數(實參表列){ 
  2. 新增成員初始化語句 

各基類的排列順序任意。

派生類構造函數的執行順序同樣為:先調用基類的構造函數,再調用派生類構造函數?;悩嬙旌瘮档恼{用順序是按照聲明派生類時基類出現的順序。

下面的定義了兩個基類,BaseA類和BaseB類,然后用多繼承的方式派生出Sub類。

 

 
  1. #include <iostream> 
  2. using namespace std; 
  3. //基類 
  4. class BaseA{ 
  5. protected
  6. int a; 
  7. int b; 
  8. public
  9. BaseA(intint); 
  10. }; 
  11. BaseA::BaseA(int a, int b): a(a), b(b){} 
  12. //基類 
  13. class BaseB{ 
  14. protected
  15. int c; 
  16. int d; 
  17. public
  18. BaseB(intint); 
  19. }; 
  20. BaseB::BaseB(int c, int d): c(c), d(d){} 
  21. //派生類 
  22. class Sub: public BaseA, public BaseB{ 
  23. private
  24. int e; 
  25. public
  26. Sub(intintintintint); 
  27. void display(); 
  28. }; 
  29. Sub::Sub(int a, int b, int c, int d, int e): BaseA(a, b), BaseB(c, d), e(e){} 
  30. void Sub::display(){ 
  31. cout<<"a="<<a<<endl; 
  32. cout<<"b="<<b<<endl; 
  33. cout<<"c="<<c<<endl; 
  34. cout<<"d="<<d<<endl; 
  35. cout<<"e="<<e<<endl; 
  36. int main(){ 
  37. (new Sub(1, 2, 3, 4, 5)) -> display(); 
  38. return 0; 

運行結果:

 

 
  1. a=1 
  2. b=2 
  3. c=3 
  4. d=4 
  5. e=5 

從基類BaseA和BaseB繼承來的成員變量,在 Sub::display() 中都可以訪問。

命名沖突

當兩個基類中有同名的成員時,就會產生命名沖突,這時不能直接訪問該成員,需要加上類名和域解析符。

假如在基類BaseA和BaseB中都有成員函數 display(),那么下面的語句是錯誤的:

 

 
  1. Sub obj; 
  2. obj.display(); 

由于BaseA和BaseB中都有display(),系統將無法判定到底要調用哪一個類的函數,所以報錯。

應該像下面這樣加上類名和域解析符:

 

 
  1. Sub obj; 
  2. obj.BaseA::display(); 
  3. obj.BaseB::display(); 

通過這個舉例可以發現:在多重繼承時,從不同的基類中會繼承一些重復的數據。如果有多個基類,問題會更突出,所以在設計派生類時要細致考慮其數據成員,盡量減少數據冗余。

C++多重繼承的二義性問題

多重繼承可以反映現實生活中的情況,能夠有效地處理一些較復雜的問題,使編寫程序具有靈活性,但是多重繼承也引起了一些值得注意的問題,它增加了程序的復雜度,使 程序的編寫和維護變得相對困難,容易出錯。其中最常見的問題就是繼承的成員同名而產生的二義性(ambiguous)問題。

如果類A和類B中都有成員函數display和數據成員a,類C是類A和類B的直接派生類。分別討論下列3種情況。

1) 兩個基類有同名成員

代碼如下所示:

 

  1. class A 
  2. public
  3. int a; 
  4. void display(); 
  5. }; 
  6. class B 
  7. public
  8. int a; 
  9. void display (); 
  10. }; 
  11. class C: public A, public B 
  12. public
  13. int b; 
  14. void show(); 
  15. }; 

如果在main函數中定義C類對象cl,并調用數據成員a和成員函數display :

 

 
  1. C cl; 
  2. cl.a=3; 
  3. cl.display(); 

由于基類A和基類B都有數據成員a和成員函數display,編譯系統無法判別要訪問的是哪一個基類的成員,因此程序編譯出錯。那么,應該怎樣解決這個問題呢?可以用基類名來限定:

 

 
  1. cl.A::a=3; //引用cl對象中的基類A的數據成員a 
  2. cl.A::display(); //調用cl對象中的基類A的成員函數display 

如果是在派生類C中通過派生類成員函數show訪問基類A的display和a,可以不 必寫對象名而直接寫

 

 
  1. A::a = 3; //指當前對象 
  2. A::display(); 

2) 兩個基類和派生類三者都有同名成員

將上面的C類聲明改為:

 

 
  1. class C: public A, public B 
  2. int a; 
  3. void display(); 
  4. }; 

如果在main函數中定義C類對象cl,并調用數據成員a和成員函數display:

 

 
  1. C cl; 
  2. cl.a = 3; 
  3. cl.display(); 

此時,程序能通過編譯,也可以正常運行。請問:執行時訪問的是哪一個類中的成員?答案是:訪問的是派生類C中的成員。規則是:基類的同名成員在派生類中被屏蔽,成為“不可見”的,或者說,派生類新增加的同名成員覆蓋了基類中的同名成員。因此如果在定義派生類對象的模塊中通過對象名訪問同名的成員,則訪問的是派生類的成員。請注意:不同的成員函數,只有在函數名和參數個數相同、類型相匹配的情況下才發生同名覆蓋,如果只有函數名相同而參數不同,不會發生同名覆蓋,而屬于函數重載。

有些讀者可能對同名覆蓋感到不大好理解。為了說明問題,舉個例子,例如把中國作為基類,四川則是中國的派生類,成都則是四川的派生類?;愂窍鄬Τ橄蟮?,派生類是相對具體的,基類處于外層,具有較廣泛的作用域,派生類處于內層,具有局部的作用域。若“中國”類中有平均溫度這一屬性,四川和成都也都有平均溫度這一屬性,如果沒有四川和成都這兩個派生類,談平均溫度顯然是指全國平均溫度。如果在四川,談論當地的平均溫度顯然是指四川的平均溫度;如果在成都,談論當地的平均溫度顯然是指成都的平均溫度。這就是說,全國的“平均溫度”在四川省被四川的“平均溫度”屏蔽了,或者說,四川的“平均溫度”在當地屏蔽了全國的“平均溫度”。四川人最關心的是四川的溫度,當然不希望用全國溫度覆蓋四川的平均溫度。

如果在四川要查全國平均溫度,一定要聲明:我要查的是全國的平均溫度。同樣,要在派生類外訪問基類A中的成員,應指明作用域A,寫成以下形式:

 

 
  1. cl.A::a=3; //表示是派生類對象cl中的基類A中的數據成員a 
  2. cl.A::display(); //表示是派生類對象cl中的基類A中的成員函數display 

3) 類A和類B是從同一個基類派生的

代碼如下所示:

 

 
  1. class N 
  2. public
  3. int a; 
  4. void display(){ cout<<"A::a="<<a<<endl; } 
  5. }; 
  6. class A: public N 
  7. public
  8. int al; 
  9. }; 
  10. class B: public N 
  11. public
  12. int a2; 
  13. }; 
  14. class C: public A, public B 
  15. public
  16. int a3; 
  17. void show(){ cout<<"a3="<<a3<<endl; } 
  18. int main() 
  19. C cl; //定義C類對象cl 
  20. // 其他代碼 

在類A和類B中雖然沒有定義數據成員a和成員函數display,但是它們分別從類N繼承了數據成員a和成員函數display,這樣在類A和類B中同時存在著兩個同名的數據成員a和成員函數display。它們是N類成員的拷貝。類A和類B中的數據成員a代表兩個不同的存儲單元,可以分別存放不同的數據。在程序中可以通過類A和類B的構造函數去調用基類N的構造函數,分別對類A和類B的數據成員a初始化。

怎樣才能訪問類A中從基類N繼承下來的成員呢?顯然不能用

 

 
  1. cl.a = 3; cl.display(); 

 

 
  1. cl.N::a = 3; cl. N::display(); 

因為這樣依然無法區別是類A中從基類N繼承下來的成員,還是類B中從基類N繼承下來的成員。應當通過類N的直接派生類名來指出要訪問的是類N的哪一個派生類中的基類成員。如

 

 
  1. cl.A::a=3; cl.A::display(); //要訪問的是類N的派生類A中的基類成員 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲精品成人天堂一二三| 91中文字幕在线播放| 中文字幕在线观看第二页| 成人中文字幕在线| 亚洲女人天堂成人av在线| 欧美日本国产精品| 波多野结衣影院| 丰满岳乱妇国产精品一区| 亚洲成精国产精品女| 成人激情黄色网| 人妻体体内射精一区二区| 国产又粗又猛又爽又| 懂色av一区二区三区免费观看| 亚洲成人激情视频| 久久成人免费观看| 国产91久久久| 亚洲不卡在线观看| 懂色一区二区三区av片| 久久精品视频5| 亚洲国产精品尤物yw在线观看| 久久久最新网址| 中文字幕免费高清| 亚洲成在人线在线播放| 欧美专区一二三 | 亚洲 国产 日韩 综合一区| 国产无套丰满白嫩对白| 精品国产不卡一区二区三区| 亚洲春色在线| 日韩中文字幕在线观看视频| 欧美日韩国产首页在线观看| 国产91在线视频观看| 免费激情视频网站| 午夜激情综合网| 亚洲精品无码国产| 国产精品911| 91黑丝高跟在线| 天天摸日日摸狠狠添| 91久久精品国产91性色tv| 欧美一区二区在线| 日韩av不卡在线观看| 日韩视频一区二区三区| 国产精欧美一区二区三区白种人| 久久精品人人| 2020欧美日韩在线视频| 中文字幕求饶的少妇| 国产精品久久久久天堂| 国模吧一区二区| 国产污视频网站| 精品国内自产拍在线观看| 日韩一级av毛片| 亚洲第一主播视频| 中文字幕成人免费视频| 午夜亚洲福利老司机| 你真棒插曲来救救我在线观看| 一区二区视频播放| 青青久久av北条麻妃海外网| 手机在线看片1024| 久久精品在线视频| 亚洲黄色一级大片| 国产综合第一页| 久久久精品人体av艺术| 成人av在线播放观看| 天堂av一区二区三区| 久久国产一区二区| 国产精品久久久久久久久免费丝袜| 亚洲欧美日韩在线综合| 亚洲一区二三区| av鲁丝一区鲁丝二区鲁丝三区| 日韩欧美久久一区| 中文字幕欧美人妻精品一区蜜臀| 国产精品国产精品国产专区蜜臀ah| 国产在线国偷精品产拍免费yy | 黄色片视频网站| 精品国产一区二区三区在线观看 | 日韩精品手机在线| 国产日韩欧美在线视频观看| 国产精品影视在线观看| 能在线观看的av| 亚洲精品一区二区三区精华液| 精品一区免费观看| 欧美性xxxx69| 午夜私人影院久久久久| 亚洲自拍偷拍图| 爽爽爽爽爽爽爽成人免费观看| 国产三级漂亮女教师| 妞干网这里只有精品| 精品久久久久久久久久久院品网 | 日韩一区二区三区精品视频| 国产特黄一级片| 欧美日韩三区四区| 精品国产免费观看| 国产国语videosex另类| 欧美极品少妇xxxxⅹ高跟鞋 | 亚洲伊人第一页| 久久免费视频一区| 亚洲一区二区福利视频| 久久久久久久影院| 欧美日韩一区二区三区免费| 久久成人小视频| 久久九九国产精品怡红院 | 日本天堂中文字幕| 91精品国产高清久久久久久91裸体 | 91成人在线看| 中文字幕av一区二区三区高 | 国产九色91回来了| 免费在线黄网站| 久久夜色撩人精品| 一区二区三区四区视频精品免费| 波多野结衣视频免费观看| 一区二区三区四区视频在线观看| 欧美大片一区二区三区| 久久爱www久久做| 亚洲AV无码成人精品区明星换面 | 最近中文字幕无免费| 国产九色精品| 亚洲小视频在线| 亚洲三级在线看| 国产寡妇亲子伦一区二区三区四区| 女人床在线观看| 欧美一区第一页| 精品国产乱码久久久久久图片 | 艹b视频在线观看| 国内精品久久影院| 亚洲欧美日韩综合aⅴ视频| 99久久精品无免国产免费| www国产精品内射老熟女| 国产成人久久久| 国产亚洲欧美日韩精品| 欧美午夜激情小视频| 99久久精品国产导航| 国产黄色美女视频| 久久久久99精品| 日韩精品视频一二三| 一区二区三区偷拍| 成人在线播放av| 国产69精品99久久久久久宅男| 亚洲国产精品久久久久秋霞蜜臀| 亚洲免费在线观看| www.日韩精品| 亚洲免费黄色片| 97精品久久人人爽人人爽| 日韩av毛片在线观看| 中文文字幕文字幕高清| 超级碰在线观看| 蜜桃麻豆www久久国产精品| 91精品久久久久久久久久| 国外成人性视频| www.欧美精品| 国产午夜精品全部视频播放 | 日韩精品在线观看一区| 亚洲日本一区二区三区| 成人激情小说乱人伦| 日韩中文字幕1| 在线能看的av| 亚洲毛片亚洲毛片亚洲毛片| 日韩av中文字幕第一页| 国产精品日韩电影| 国产精品欧美一区二区三区奶水| 日本十八禁视频无遮挡| 99视频精品免费| 在线观看亚洲视频啊啊啊啊| 激情视频一区二区| 成人高清在线观看| 亚洲aⅴ天堂av在线电影软件| 久久99欧美| 欧美色图亚洲自拍| 久久免费一级片| 国产一区二区三区小说| 天堂av免费看| 九一精品在线观看| 国产三区在线视频| 国产亚洲视频一区| 熟女丰满老熟女熟妇| 日本人亚洲人jjzzjjz| 538精品在线观看| 亚洲一区 中文字幕| 免播放器亚洲一区| 精品国产乱码一区二区三| 日韩国产欧美视频| 日本一区二区三区国色天香 | 欧美成人激情图片网| 国产999精品| 欧美一区二区三区精美影视 | 99视频热这里只有精品免费| 日韩毛片一二三区| 精品国产乱码久久久久久婷婷| 日韩一区二区三区四区| 亚洲人成电影网| 日本免费久久高清视频| 国产欧美一区二区在线播放| 无码人妻丰满熟妇区五十路百度| 欧洲女同同性吃奶| 亚洲精品福利网站| www.色精品| 亚洲第一区在线观看| 国产精品成人av性教育| 无码人妻精品一区二区蜜桃网站| 特级西西人体wwwww| 午夜精品久久久久久久第一页按摩 | 亚洲福利电影网| 色偷偷噜噜噜亚洲男人| 国产a一区二区| 国偷自产av一区二区三区麻豆| 日韩精选在线观看| 一区二区视频网| 偷拍与自拍一区| 久久久久久尹人网香蕉| 无码人妻精品一区二区蜜桃百度| 免费观看特级毛片| 国产综合色视频| 欧美一级日韩不卡播放免费| 91免费观看网站| 最新版天堂资源在线| 葵司免费一区二区三区四区五区| 欧美日韩色婷婷| 国产精品久在线观看| 亚洲欧美在线精品| 一级aaaa毛片| 在线观看免费亚洲| 国产一区二区三区在线观看视频 | 男女男精品视频网| 欧洲一区二区av| 日韩欧美一区二区三区四区| 精品视频久久久久| 亚洲欧美日韩综合aⅴ视频| 57pao精品| 国产精品无码一区二区三| 99热一区二区| 久久久久久9999| 日韩美女视频免费在线观看| 亚洲第一天堂久久| 在线观看中文字幕av| 欧美艳星brazzers| 亚洲成人第一| av中文字幕播放| 亚洲精品一区二区三区婷婷月| 欧美亚洲黄色片| 欧美激情在线免费观看| 国产视频99| 水野朝阳av一区二区三区| 久久成人人人人精品欧| 欧美日韩在线国产| 欧美不卡在线视频| 国产精品扒开腿做爽爽爽a片唱戏| 久久网这里都是精品| 欧美日韩国产一二| 亚洲精品久久久狠狠狠爱| 北条麻妃一区二区三区中文字幕| 精品少妇人妻av一区二区三区| 亚洲国产精品传媒在线观看| 美女100%露胸无遮挡| 成人亚洲视频在线观看| 久久99这里只有精品| 国产精品wwww| 中文字幕你懂的| 最近2019免费中文字幕视频三| 中文字幕在线永久| 精品久久久一区| 男人插女人视频在线观看| 成人精品亚洲人成在线| 99久久一区三区四区免费| 一级黄色短视频| 91高清视频免费| 久草成人在线视频| 日韩av影视综合网| 欧美视频国产视频| 欧美日韩精品免费| 女性生殖扒开酷刑vk| 欧美日韩一区二区在线观看视频| 粉嫩虎白女毛片人体| 亚洲精品亚洲人成人网在线播放| 国产精品欧美日韩一区二区| 国产精品久久久久久久免费看| 日韩av综合中文字幕| 青花影视在线观看免费高清| 欧美一级欧美一级在线播放| 91国模少妇一区二区三区| 日韩欧美精品在线视频| 性生活在线视频| 7777精品伊人久久久大香线蕉 | 精品人妻一区二区三区四区在线| 久久久久久久久久久网| 欧美日韩视频在线观看一区二区三区 | 欧美人与性动交| 人妻aⅴ无码一区二区三区| 91国产免费看| 五月天六月丁香| 午夜在线成人av| 免费毛片网站在线观看| 国产精品视频在线看| 亚洲av成人片色在线观看高潮| 日韩三级影视基地| 久久亚洲精品国产| 国产成人综合亚洲| 成人国产精品免费观看视频| 91超薄肉色丝袜交足高跟凉鞋| 亚洲第一色在线| 18精品爽视频在线观看| 国产+人+亚洲| 奇米影视第四色777| 亚洲专区中文字幕| 国产精品国产三级国产普通话三级| 日本黄网站免费| 91精品国产欧美一区二区成人| 久久亚洲无码视频| 欧美在线性视频| 91免费视频观看| 黑森林av导航| 日韩精品中文字| 亚洲国产精品欧美久久| 亚洲三级一区| 欧美日韩国产高清一区二区三区 | 噼里啪啦国语在线观看免费版高清版| 亚洲国产成人91porn| 色婷婷在线影院| 欧美最顶级的aⅴ艳星| 日本污视频在线观看| 国产精品久久久久久久久久尿| 成人动漫精品一区二区| 三级在线视频观看| 国产成人精品999| 亚洲图片欧美一区| 欧美日韩在线观看成人| 日韩一区二区三区资源| 色综合久久中文字幕综合网| 中文字幕日韩第一页| www.国产在线播放| 欧美日韩国产成人高清视频| 久久综合九色综合97婷婷女人| 极品蜜桃臀肥臀-x88av| 国产精品一区二区三区不卡 | 艳母动漫在线免费观看| 国产一区二区三区久久精品 | 欧美黑人又粗大| 日韩不卡手机在线v区| 能看毛片的网站| 精品久久久久久一区| 亚洲白拍色综合图区| 2021久久国产精品不只是精品| 亚洲色成人www永久网站| 欧美韩国日本在线| 91精品中国老女人| 日韩精品在线观| 一区二区三区免费| 99久久精品国产成人一区二区| 美女又黄又免费的视频| 国产在线视频2019最新视频| 欧美卡1卡2卡| 久久久久久免费网| 久久国产视频精品| 91亚洲精品在线| 在线播放亚洲激情| 亚洲一区二区三区四区不卡| 中文字幕av片| 国产精久久一区二区三区| 噜噜噜久久亚洲精品国产品麻豆 | 国产酒店精品激情| 中文亚洲av片在线观看| 欧美另类视频在线观看| 欧美国产视频一区| 国产高清精品一区二区三区| 久久久久久网址| 欧美日本视频在线| 精品久久中文字幕久久av| 久久精品国产久精国产| 三级在线观看免费大全| 亚洲欧洲一区二区在线观看| 久久综合伊人77777| 日韩欧美福利视频| 中文字幕色av一区二区三区| 精品在线一区二区| 精品免费久久久| 91浏览器在线观看| 成人小视频免费看| 国产男女猛烈无遮挡在线喷水| 亚洲一级av无码毛片精品| 国产成人手机视频| 成人一级片网站| 在线免费观看成人| 欧美日韩另类丝袜其他| 51精品国产人成在线观看| 香蕉av福利精品导航| 婷婷综合在线观看| 欧美在线观看一二区| 亚洲精品成人久久电影| 亚洲国产成人精品久久| 538prom精品视频线放| 一本高清dvd不卡在线观看| 狠狠干狠狠久久| 欧美性猛交xxxx黑人猛交| 中文字幕av一区二区三区| 国产情人综合久久777777| 91女人视频在线观看| 国产91精品一区二区| 播五月开心婷婷综合| 久久蜜桃精品| 日韩中文字幕91| 丰满少妇在线观看bd| 国产一区二区0| 久久久久久久久久久电影| 亚洲成人免费电影| 欧美日韩一区精品| 欧美四级电影网| 亚洲美腿欧美激情另类| 欧美黄色片免费观看| 国产精品999| 国产成人精品免费久久久久 | 亚洲午夜私人影院| 欧美日韩一区二区精品| 欧美日韩亚洲视频一区|