亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

簡要解讀C++的動態和靜態關聯以及虛析構函數

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

這篇文章主要介紹了簡要解讀C++的動態和靜態關聯以及虛析構函數,析構函數在C++編程中平時并不是太常用,需要的朋友可以參考下

C++靜態關聯與動態關聯、C++是怎樣實現多態性的

在現實生活中,多態性的例子是很多的。我們分析一下人是怎樣處理多 態性的。例如,新生被錄取人大學,在人學報到時,先有一名工作人員審查材料,他的職責是甄別資格,然后根據錄取通知書上注明的錄取的系和專業,將材料轉到有關的系和專業,辦理具體的注冊人學手續,也可以看作調用不同部門的處理程序辦理入學手續。在學 生眼里,這名工作人員是總的人口,所有新生辦入學手續都要經過他。學生拿的是統一的錄取通知書,但實際上分屬不同的系,要進行不同的注冊手續,這就是多態。那么,這名工 作人員怎么處理多態呢?憑什么把它分發到哪個系呢?就是根據錄取通知書上的一個信 息(你被錄取入本校某某專業)??梢姡獏^分就必須要有相關的信息,否則是無法判別的。

同樣,編譯系統要根據已有的信息,對同名函數的調用作出判斷。例如函數的重載, 系統是根據參數的個數和類型的不同去找與之匹配的函數的。對于調用同一類族中的虛函數,應當在調用時用一定的方式告訴編譯系統,你要調用的是哪個類對象中的函數。例如可以直接提供對象名,如studl.display()或grad1.display()。這樣編譯系統在對程序進行編譯時,即能確定調用的是哪個類對象中的函數。

確定調用的具體對象的過程稱為關聯(binding)。binding原意是捆綁或連接,即把兩樣東西捆綁(或連接)在一起。在這里是指把一個函數名與一個類對象捆綁在一起,建立關聯。一般地說,關聯指把一個標識符和一個存儲地址聯系起來。在計算機字典中可以査到,所謂關聯,是指計算機程序中不同的部分互相連接的過程。有些書中把binding譯為聯編、編聯、束定、或兼顧音和意,稱之為綁定。作者認為:從意思上說,關聯比較確切, 也好理解。但是有些教程中用了聯編這個術語。 大家在看到這個名詞時,應當知道指的就是本節介紹的關聯。

順便說一句題外話,計算機領域中大部分術語是從外文翻譯過來的,有許多譯名是譯得比較好的,能見名知意的。但也有一些則令人費解,甚至不大確切。例如在某些介紹計算機語言的書籍中,把project譯為“工程”,使人難以理解,其實譯為“項目”比較確切。 有些介紹計算機應用的書中充斥大量的術語,初聽起來好像很唬人、很難懂,許多學習 C++的人往往被大量的專門術語嚇住了,又難以理解其真正含義,不少人“見難而退”。 這個問題成為許多人學習C++的攔路虎。因此,應當提倡用通俗易懂的方法去闡明復雜的概念。其實,有許多看起來深奧難懂的概念和術語,捅破窗戶紙后是很簡單的。建議讀者在初學時千萬不要糾纏于名詞術語的字面解釋上,而要掌握其精神實質和應用方法。

說明:與其他編程語言相比,例如Java、C#等,C++的語法是最豐富最靈活的,同樣也是最難掌握的,大家要循序漸進,莫求速成,在編程實踐中不斷翻閱和記憶。

前面所提到的函數重載和通過對象名調用的虛函數,在編譯時即可確定其調用的虛函數屬于哪一個類,其過程稱為靜態關聯(static binding),由于是在運行前進行關聯的, 故又稱為早期關聯(early binding)。函數重載屬靜態關聯。

在調用虛函數時并沒有指定對象名,那么系統是怎樣確定關聯的呢?讀者可以看到,是通過基類指針與虛函數的結合來實現多態性的。先定義了一個指向基類的指針變量,并使它指向相應的類對象,然后通過這個基類指針去調用虛函數(例如“pt->display()”)。顯然,對這樣的調用方式,編譯系統在編譯該行時是無法確定調用哪一個類對象的虛函數的。因為編譯只作靜態的語法檢査,光從語句形式(例如“pt->display();”)是無法確定調用對象的。

在這樣的情況下,編譯系統把它放到運行階段處理,在運行階段確定關聯關系。在運行階段,基類指針變量先指向了某一個類對象,然后通過此指針變量調用該對象中的函數。此時調用哪一個對象的函數無疑是確定的。例如,先使pt指向grad1,再執行“pt->display()”,當然是調用grad1中的display函數。由于是在運行階段把虛函數和類對象“綁定”在一起的,因此,此過程稱為動態關聯(dynamic binding)。這種多態性是動態的多態性,即運行階段的多態性。

在運行階段,指針可以先后指向不同的類對象,從而調用同一類族中不同類的虛函數。由于動態關聯是在編譯以后的運行階段進行的,因此也稱為滯后關聯(late binding) 。

C++虛析構函數詳解

當派生類的對象從內存中撤銷時一般先調用派生類的析構函數,然后再調用基類的析構函數。但是,如果用new運算符建立了臨時對象,若基類中有析構函數,并且定義了一個指向該基類的指針變量。在程序用帶指針參數的delete運算符撤銷對象時,會發生一個情況:系統會只執行基類的析構函數,而不執行派生類的析構函數。

[例] 基類中有非虛析構函數時的執行情況。為簡化程序,只列出最必要的部分。

 

 
  1. #include <iostream> 
  2. using namespace std; 
  3. class Point //定義基類Point類 
  4. public
  5. Point( ){} //Point類構造函數 
  6. ~Point(){cout<<"executing Point destructor"<<endl;} //Point類析構函數 
  7. }; 
  8. class Circle:public Point //定義派生類Circle類 
  9. public
  10. Circle( ){} //Circle類構造函數 
  11. ~Circle( ){cout<<"executing Circle destructor"<<endl;} //Circle類析構函數 
  12. private
  13. int radius; 
  14. }; 
  15. int main( ) 
  16. Point *p=new Circle; //用new開辟動態存儲空間 
  17. delete p; //用delete釋放動態存儲空間 
  18. return 0; 

這只是一個示意的程序。p是指向基類的指針變量,指向new開辟的動態存儲空間,希望用detele釋放p所指向的空間。但運行結果為:

 

 
  1. executing Point destructor 

表示只執行了基類Point的析構函數,而沒有執行派生類Circle的析構函數。

如果希望能執行派生類Circle的析構函數,可以將基類的析構函數聲明為虛析構函數,如:

 

 
  1. virtual ~Point(){cout<<″executing Point destructor″<<endl;} 

程序其他部分不改動,再運行程序,結果為:

 

  
  1. executing Circle destructor 
  2. executing Point destructor 

先調用了派生類的析構函數,再調用了基類的析構函數,符合人們的愿望。

當基類的析構函數為虛函數時,無論指針指的是同一類族中的哪一個類對象,系統會采用動態關聯,調用相應的析構函數,對該對象進行清理工作。

如果將基類的析構函數聲明為虛函數時,由該基類所派生的所有派生類的析構函數也都自動成為虛函數,即使派生類的析構函數與基類的析構函數名字不相同。

最好把基類的析構函數聲明為虛函數。這將使所有派生類的析構函數自動成為虛函數。這樣,如果程序中顯式地用了delete運算符準備刪除一個對象,而delete運算符的操作對象用了指向派生類對象的基類指針,則系統會調用相應類的析構函數。

虛析構函數的概念和用法很簡單,但它在面向對象程序設計中卻是很重要的技巧。

專業人員一般都習慣聲明虛析構函數,即使基類并不需要析構函數,也顯式地定義一個函數體為空的虛析構函數,以保證在撤銷動態分配空間時能得到正確的處理。

構造函數不能聲明為虛函數。這是因為在執行構造函數時類對象還未完成建立過程,當然談不上函數與類對象的綁定。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美xxxx14xxxxx性爽| 欧美国产日韩一区二区| 91精品国产91久久久| 欧美精品激情在线观看| 欧美一区二区三区精品电影| 91av福利视频| 自拍偷拍亚洲一区| 欧美黄色三级网站| 国产精品久久久久久久一区探花| 性日韩欧美在线视频| 成人高h视频在线| 亚洲爱爱爱爱爱| 亚洲精品视频免费| 亚洲精品丝袜日韩| 国产精国产精品| 国产在线拍揄自揄视频不卡99| 午夜精品免费视频| 国产精品爽黄69| 欧美黄色片视频| 亚洲2020天天堂在线观看| 欧美一级淫片videoshd| 精品中文视频在线| 国产精品999999| 成人激情视频在线观看| 自拍偷拍亚洲欧美| 亚洲日本欧美日韩高观看| 亚洲精品小视频在线观看| 国产91色在线免费| 亚洲护士老师的毛茸茸最新章节| 4438全国亚洲精品在线观看视频| 国产区精品在线观看| 中文字幕欧美日韩精品| 麻豆成人在线看| 97国产精品人人爽人人做| 国产精品视频xxx| 国产中文字幕亚洲| 亚洲精品一区中文| 一区二区三区天堂av| 亚洲黄色成人网| 亚洲视频自拍偷拍| 中文字幕九色91在线| 国产精品91久久久久久| 亚洲自拍偷拍色片视频| 欧美高跟鞋交xxxxhd| 久久伊人精品天天| 久久久久一本一区二区青青蜜月| 国产999精品| 久久青草福利网站| 久久精品一偷一偷国产| 91精品国产高清久久久久久久久| 国产精品草莓在线免费观看| 美女黄色丝袜一区| 黄色一区二区三区| 欧美专区日韩视频| 国产视频综合在线| 国产成人精品最新| 青青草成人在线| 少妇精69xxtheporn| 亚洲日本中文字幕免费在线不卡| 欧美福利在线观看| 欧美午夜女人视频在线| 欧美色视频日本高清在线观看| 日韩在线欧美在线| 亚洲成人黄色在线观看| 美女福利视频一区| 欧美日韩国产区| 国产成人精品一区| 国产精品欧美久久久| 欧美激情2020午夜免费观看| 国产欧美婷婷中文| 欧美日韩国产一区在线| 欧美最顶级丰满的aⅴ艳星| 欧美在线一区二区三区四| 日韩三级影视基地| 成人欧美一区二区三区在线| 精品美女国产在线| 欧美激情久久久久| 亚洲精品视频播放| 久久精品在线视频| 日韩亚洲在线观看| 亚洲人午夜色婷婷| 国产这里只有精品| 国产一区二区三区在线观看视频| 亚洲在线一区二区| 91成人天堂久久成人| xvideos成人免费中文版| 精品久久久免费| 欧美性videos高清精品| 性日韩欧美在线视频| 中文字幕在线看视频国产欧美| 精品少妇一区二区30p| 欧美在线xxx| 亚洲热线99精品视频| 美女啪啪无遮挡免费久久网站| 亚洲福利视频在线| 久久不射热爱视频精品| 成人精品一区二区三区电影黑人| 亚洲bt欧美bt日本bt| 另类色图亚洲色图| 亚洲一区二区日本| 欧美丰满少妇xxxxx做受| 日韩有码在线观看| 欧美亚洲日本网站| 亚洲精品wwwww| 久久亚洲精品中文字幕冲田杏梨| 韩国一区二区电影| 亚洲va久久久噜噜噜久久天堂| 91免费版网站入口| 日韩网站在线观看| 国语自产精品视频在免费| 久久久电影免费观看完整版| 久久成人这里只有精品| 久久久久女教师免费一区| 亚洲欧美中文字幕在线一区| 久久国产精彩视频| 久久精品人人爽| 国产做受69高潮| 亚洲国产高清高潮精品美女| 欧美在线国产精品| 亚洲3p在线观看| 96国产粉嫩美女| 欧美电影第一页| 久久97精品久久久久久久不卡| 亚洲风情亚aⅴ在线发布| 51精品国产黑色丝袜高跟鞋| 久久亚洲精品成人| 国产国语刺激对白av不卡| 日韩亚洲国产中文字幕| 日韩中文在线视频| 亚洲jizzjizz日本少妇| 午夜精品久久久久久久久久久久| 欧美极品少妇xxxxx| 欧美一级黑人aaaaaaa做受| 国产精品久久久久久久久久久新郎| 国产精品美女网站| 国产精品九九久久久久久久| 国产精品专区h在线观看| 亚洲精品mp4| 欧美成人午夜激情在线| 国产精品日韩在线一区| 亚洲精品网址在线观看| 97在线看免费观看视频在线观看| 韩国三级电影久久久久久| 国产亚洲日本欧美韩国| 日韩中文字幕亚洲| 不卡av日日日| 国产精品久久久久福利| 26uuu亚洲国产精品| 国产成人精品视频在线| 国产视频精品久久久| 精品国产91久久久久久| 91久久国产婷婷一区二区| 欧美夫妻性视频| 91国内精品久久| 欧美精品制服第一页| y97精品国产97久久久久久| 亚洲精品中文字| 国产成人精品一区| 97在线免费观看视频| 91视频-88av| 久久精品视频播放| 97视频在线观看亚洲| 91日本在线视频| 成人97在线观看视频|