成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分清繼承關(guān)系中基類和子類構(gòu)造函數(shù)調(diào)用順序

開(kāi)發(fā) 開(kāi)發(fā)工具
這里將介紹繼承關(guān)系中基類和子類構(gòu)造函數(shù)調(diào)用順序,希望本文能對(duì)大家有所幫助。

我們這里將分析一下繼承關(guān)系中基類和子類構(gòu)造函數(shù)調(diào)用順序,希望通過(guò)本文,能使大家對(duì)于繼承的理解更加深刻。

首先回顧并討論先有雞還是先有蛋的問(wèn)題在C++中將會(huì)是什么情況。如果編寫(xiě):

  1. class Egg;  
  2. class Hen  
  3. {  
  4. public:  
  5. int n;  
  6. Egg egg;  
  7.     Hen() {  
  8.         n=5;  
  9.         cout<<"Hen's con "<   
  10.     }  
  11. };  
  12. class Egg : public Hen  
  13. {  
  14. public:  
  15.     int m;  
  16.     Egg(){  
  17.         m=10;  
  18.         cout<<"Egg's con"<   
  19.     }  
  20. };  
  21. int main()  
  22. {  
  23.     Egg dan;  

這在C++中是無(wú)法編譯通過(guò)的,首先,學(xué)過(guò)編譯原理的都應(yīng)該知道,所有語(yǔ)言在編譯的時(shí)候都需要確定一個(gè)類的大小。C++的編譯器在編譯一個(gè)類的時(shí)候,需要分析這個(gè)類的大小,而sizeof(Egg)=sizeof(Hen)+sizeof(Egg)+…,編譯器無(wú)法獲知其大小,自然也無(wú)法編譯通過(guò);而JAVA、C#則不同,其類的成員皆為基本類型或引用。同時(shí),和Java、C#等語(yǔ)言不同,C++不能做全局優(yōu)化編譯(即使打開(kāi)全局優(yōu)化開(kāi)關(guān)也沒(méi)有用),它的編譯是逐步向后的分析方式。C++這樣做,也在編譯時(shí)就防止出現(xiàn)先有雞還是先有蛋而產(chǎn)生的矛盾。大家可以嘗試在C++中嘗試其他方法看編譯是否能夠通過(guò)。

JAVA雖然可以在Hen類的初始化時(shí)對(duì)Egg進(jìn)行構(gòu)造(通過(guò)new Egg()),但運(yùn)行時(shí)會(huì)出現(xiàn)堆棧溢出的錯(cuò)誤:

  1. Exception in thread "main" java.lang.StackOverflowError  
  2.     at Egg.(…)  
  3.     at Hen.(…)  
  4.     at Egg.(…)  
  5.     at Hen.(…)  
  6. … 

下面回到本文的主題。我們知道,C++和JAVA不一樣,C++子類是默認(rèn)調(diào)用基類構(gòu)造函數(shù)的,而JAVA則需要super()。為了研究基類和子類構(gòu)造函數(shù)的調(diào)用順序問(wèn)題,以上述程序?yàn)榛A(chǔ),我編寫(xiě)了這樣一個(gè)測(cè)試:

  1. class Hen  
  2. {  
  3. public:  
  4.     int n;  
  5.     Hen() {  
  6.         n=5;  
  7.         cout<<"Hen's con "<   
  8.     }  
  9.    Hen(int i) {  
  10.         n=i;  
  11.         cout<<"Hen's con "<   
  12.     }  
  13. };  
  14. class Hen1  
  15. {  
  16. public:  
  17.     int x;  
  18.     Hen1() {  
  19.        x=6;  
  20.         cout<<"Hen1's con "<   
  21.     }  
  22. };  
  23. class Hen2  
  24. {  
  25. public:  
  26.     int y;  
  27.     Hen2() {  
  28.         y=7;  
  29.        cout<<"Hen2's con "<   
  30.     }  
  31. };  
  32. class Egg : public Hen, public Hen2, public Hen1  
  33. {  
  34. public:  
  35.     int m;  
  36.     Hen hen;  
  37.     Hen1 hen1;  
  38.     Hen2 hen2;  
  39.     Egg(int i) : Hen2(),Hen1(),Hen(),hen(i), hen2(), hen1(){  
  40.         m=10;  
  41.         cout<<"Egg's con"<   
  42.     }  
  43. };  
  44. int main()  
  45. {  
  46.     Egg dan(1);  
  47. }  
  48. Output:  
  49. Hen's con 5  
  50. Hen2's con 7  
  51. Hen1's con 6  
  52. Hen's con 1  
  53. Hen1's con 6  
  54. Hen2's con 7  
  55. Egg's con 

通過(guò)這段程序可得如下結(jié)論:

1、基類構(gòu)造函數(shù)。如果有多個(gè)基類,則構(gòu)造函數(shù)的調(diào)用順序是某類在類繼承表中出現(xiàn)的順序,而不是它們?cè)诔蓡T初始化表中的順序。如這里,是按照“class Egg : public Hen, public Hen2, public Hen1”的順序

2、成員類對(duì)象構(gòu)造函數(shù)。如果有多個(gè)成員類對(duì)象,則構(gòu)造函數(shù)的調(diào)用順序是對(duì)象在類中被聲明的順序,而不是它們出現(xiàn)在成員初始化表中的順序。如這里,是按照Egg聲明里

Hen hen;

Hen1 hen1;

Hen2 hen2;

的順序。

總1、2而言之,成員初始化表順序?qū)τ跇?gòu)造和賦值順序沒(méi)有任何意義

3、成員類對(duì)象并不是一開(kāi)始就被構(gòu)造,再根據(jù)初始化表賦值,而是在調(diào)用構(gòu)造函數(shù)的時(shí)候,根據(jù)傳入的參數(shù)根據(jù)成員初始化表中進(jìn)行一次構(gòu)造,構(gòu)造順序是對(duì)象在類中聲明的順序。

【編輯推薦】

  1. C#從C和C++繼承的特點(diǎn)淺談
  2. 實(shí)現(xiàn)C#繼承與C#多態(tài)的實(shí)例演示
  3. 關(guān)于interface繼承來(lái)源的討論
  4. 學(xué)習(xí)C#接口繼承
  5. C#繼承構(gòu)造函數(shù)實(shí)現(xiàn)及調(diào)用淺析
責(zé)任編輯:彭凡 來(lái)源: 51CTO.com
相關(guān)推薦

2010-01-20 18:06:06

C++虛基類

2013-03-04 11:10:03

JavaJVM

2009-10-23 11:31:05

CLR Via C#調(diào)

2009-08-13 18:36:36

C#繼承構(gòu)造函數(shù)

2023-12-07 07:41:15

JavaScript函數(shù)原型

2009-06-18 09:51:25

Java繼承

2009-12-10 13:37:16

PHP parent

2011-08-24 13:56:27

JavaScript

2009-08-13 18:26:35

C#繼承構(gòu)造函數(shù)

2025-02-07 08:47:38

C#派生類接口

2009-12-11 10:42:00

Scala講座類定義構(gòu)造函數(shù)

2009-12-16 09:43:35

Ruby父類Objec

2009-08-13 18:15:06

C#繼承構(gòu)造函數(shù)

2020-06-17 12:22:44

C覆蓋重載

2022-01-04 19:33:03

Java構(gòu)造器調(diào)用

2009-09-03 13:14:55

C#構(gòu)造函數(shù)C#析構(gòu)函數(shù)

2009-07-31 16:06:50

成員函數(shù)構(gòu)造函數(shù)C#

2011-08-08 09:51:52

Cocoa 框架

2009-08-14 09:15:28

C#調(diào)用構(gòu)造函數(shù)

2009-09-04 11:15:07

選擇C#構(gòu)造函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 337p日本欧洲亚洲大胆鲁鲁 | 国产成人精品一区 | 国产成人精品免费视频 | 国产一区二区在线免费观看 | 亚洲逼院 | 欧美日韩在线一区二区三区 | 国产午夜精品视频 | 一区二区三区视频在线观看 | 欧美国产精品 | 日韩淫片免费看 | 久久综合九色综合欧美狠狠 | 日韩一区精品 | 日本中文在线视频 | 成人免费在线 | 6080yy精品一区二区三区 | 欧美一区二区三区在线观看 | 亚洲毛片在线 | 久久草在线视频 | 亚洲精品综合 | 成人精品高清 | 国产日韩欧美精品一区二区 | 日本一二三区在线观看 | 中文字幕爱爱视频 | 国产日韩免费视频 | 欧美一区成人 | 中文字幕亚洲欧美日韩在线不卡 | 亚洲精品白浆高清久久久久久 | 久久亚洲一区二区 | 国产乱码精品1区2区3区 | 日韩高清国产一区在线 | 一区二区三区四区在线视频 | 九九99九九精彩46 | 日韩成人在线网站 | 亚洲视频一区在线观看 | 波多野吉衣在线播放 | 四虎影院欧美 | 国产精品视频久久 | 亚洲精品视频一区 | 久久国产欧美日韩精品 | 成人免费网站在线 | 视频一区中文字幕 |