最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡要解讀C++的動態(tài)和靜態(tài)關(guān)聯(lián)以及虛析構(gòu)函數(shù)

 更新時間:2015年09月23日 16:00:49   投稿:goldensun  
這篇文章主要介紹了簡要解讀C++的動態(tài)和靜態(tài)關(guān)聯(lián)以及虛析構(gòu)函數(shù),析構(gòu)函數(shù)在C++編程中平時并不是太常用,需要的朋友可以參考下

C++靜態(tài)關(guān)聯(lián)與動態(tài)關(guān)聯(lián)、C++是怎樣實現(xiàn)多態(tài)性的
在現(xiàn)實生活中,多態(tài)性的例子是很多的。我們分析一下人是怎樣處理多 態(tài)性的。例如,新生被錄取人大學(xué),在人學(xué)報到時,先有一名工作人員審查材料,他的職責(zé)是甄別資格,然后根據(jù)錄取通知書上注明的錄取的系和專業(yè),將材料轉(zhuǎn)到有關(guān)的系和專業(yè),辦理具體的注冊人學(xué)手續(xù),也可以看作調(diào)用不同部門的處理程序辦理入學(xué)手續(xù)。在學(xué) 生眼里,這名工作人員是總的人口,所有新生辦入學(xué)手續(xù)都要經(jīng)過他。學(xué)生拿的是統(tǒng)一的錄取通知書,但實際上分屬不同的系,要進(jìn)行不同的注冊手續(xù),這就是多態(tài)。那么,這名工 作人員怎么處理多態(tài)呢?憑什么把它分發(fā)到哪個系呢?就是根據(jù)錄取通知書上的一個信 息(你被錄取入本校某某專業(yè))。可見,要區(qū)分就必須要有相關(guān)的信息,否則是無法判別的。

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

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

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

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

前面所提到的函數(shù)重載和通過對象名調(diào)用的虛函數(shù),在編譯時即可確定其調(diào)用的虛函數(shù)屬于哪一個類,其過程稱為靜態(tài)關(guān)聯(lián)(static binding),由于是在運(yùn)行前進(jìn)行關(guān)聯(lián)的, 故又稱為早期關(guān)聯(lián)(early binding)。函數(shù)重載屬靜態(tài)關(guān)聯(lián)。

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

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

在運(yùn)行階段,指針可以先后指向不同的類對象,從而調(diào)用同一類族中不同類的虛函數(shù)。由于動態(tài)關(guān)聯(lián)是在編譯以后的運(yùn)行階段進(jìn)行的,因此也稱為滯后關(guān)聯(lián)(late binding) 。


C++虛析構(gòu)函數(shù)詳解
當(dāng)派生類的對象從內(nèi)存中撤銷時一般先調(diào)用派生類的析構(gòu)函數(shù),然后再調(diào)用基類的析構(gòu)函數(shù)。但是,如果用new運(yùn)算符建立了臨時對象,若基類中有析構(gòu)函數(shù),并且定義了一個指向該基類的指針變量。在程序用帶指針參數(shù)的delete運(yùn)算符撤銷對象時,會發(fā)生一個情況:系統(tǒng)會只執(zhí)行基類的析構(gòu)函數(shù),而不執(zhí)行派生類的析構(gòu)函數(shù)。

[例] 基類中有非虛析構(gòu)函數(shù)時的執(zhí)行情況。為簡化程序,只列出最必要的部分。

#include <iostream>
using namespace std;
class Point //定義基類Point類
{
public:
  Point( ){} //Point類構(gòu)造函數(shù)
  ~Point(){cout<<"executing Point destructor"<<endl;} //Point類析構(gòu)函數(shù)
};
class Circle:public Point //定義派生類Circle類
{
public:
  Circle( ){} //Circle類構(gòu)造函數(shù)
  ~Circle( ){cout<<"executing Circle destructor"<<endl;} //Circle類析構(gòu)函數(shù)
private:
  int radius;
};
int main( )
{
  Point *p=new Circle; //用new開辟動態(tài)存儲空間
  delete p; //用delete釋放動態(tài)存儲空間
  return 0;
}

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

executing Point destructor

表示只執(zhí)行了基類Point的析構(gòu)函數(shù),而沒有執(zhí)行派生類Circle的析構(gòu)函數(shù)。

如果希望能執(zhí)行派生類Circle的析構(gòu)函數(shù),可以將基類的析構(gòu)函數(shù)聲明為虛析構(gòu)函數(shù),如:

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

程序其他部分不改動,再運(yùn)行程序,結(jié)果為:

executing Circle destructor
executing Point destructor

先調(diào)用了派生類的析構(gòu)函數(shù),再調(diào)用了基類的析構(gòu)函數(shù),符合人們的愿望。

當(dāng)基類的析構(gòu)函數(shù)為虛函數(shù)時,無論指針指的是同一類族中的哪一個類對象,系統(tǒng)會采用動態(tài)關(guān)聯(lián),調(diào)用相應(yīng)的析構(gòu)函數(shù),對該對象進(jìn)行清理工作。

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

最好把基類的析構(gòu)函數(shù)聲明為虛函數(shù)。這將使所有派生類的析構(gòu)函數(shù)自動成為虛函數(shù)。這樣,如果程序中顯式地用了delete運(yùn)算符準(zhǔn)備刪除一個對象,而delete運(yùn)算符的操作對象用了指向派生類對象的基類指針,則系統(tǒng)會調(diào)用相應(yīng)類的析構(gòu)函數(shù)。

虛析構(gòu)函數(shù)的概念和用法很簡單,但它在面向?qū)ο蟪绦蛟O(shè)計中卻是很重要的技巧。

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

構(gòu)造函數(shù)不能聲明為虛函數(shù)。這是因為在執(zhí)行構(gòu)造函數(shù)時類對象還未完成建立過程,當(dāng)然談不上函數(shù)與類對象的綁定。

相關(guān)文章

  • C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)循環(huán)順序隊列

    C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)循環(huán)順序隊列

    這篇文章主要介紹了 C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)循環(huán)順序隊列的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • C++ 之 Asio 庫(全面解析)

    C++ 之 Asio 庫(全面解析)

    下面小編就為大家?guī)硪黄狢++ 之 Asio 庫(全面解析)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • C++入門教程詳解之命名空間、函數(shù)重載、缺省參數(shù)

    C++入門教程詳解之命名空間、函數(shù)重載、缺省參數(shù)

    這篇文章主要介紹了C++入門教程詳解之命名空間、函數(shù)重載、缺省參數(shù),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • c++11多線程編程之std::async的介紹與實例

    c++11多線程編程之std::async的介紹與實例

    這篇文章主要給大家介紹了關(guān)于c++11多線程編程之std::async的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Opencv實現(xiàn)畫筆功能

    Opencv實現(xiàn)畫筆功能

    這篇文章主要為大家詳細(xì)介紹了Opencv實現(xiàn)畫筆功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • C++智能指針詳解

    C++智能指針詳解

    從比較簡單的層面來看,智能指針是RAII(Resource Acquisition Is Initialization,資源獲取即初始化)機(jī)制對普通指針進(jìn)行的一層封裝。這樣使得智能指針的行為動作像一個指針,本質(zhì)上卻是一個對象,這樣可以方便管理一個對象的生命周期
    2022-08-08
  • C++多線程之互斥鎖與死鎖

    C++多線程之互斥鎖與死鎖

    互斥鎖和死鎖是C++多線程中常見的情況,這篇文章就帶大家進(jìn)一步了解多線程中的互斥鎖與死鎖這兩個概念,文中的示例代碼介紹得很詳細(xì),快來跟隨小編一起學(xué)習(xí)吧
    2021-12-12
  • 一篇文章徹底弄懂C++虛函數(shù)的實現(xiàn)機(jī)制

    一篇文章徹底弄懂C++虛函數(shù)的實現(xiàn)機(jī)制

    C++中的虛函數(shù)的作用主要是實現(xiàn)了多態(tài)的機(jī)制,基類定義虛函數(shù),子類可以重寫該函數(shù),在派生類中對基類定義的虛函數(shù)進(jìn)行重寫時,需要在派生類中聲明該方法為虛方法,這篇文章主要給大家介紹了關(guān)于如何通過一篇文章徹底弄懂C++虛函數(shù)的實現(xiàn)機(jī)制,需要的朋友可以參考下
    2021-06-06
  • C語言實現(xiàn)掃雷附完整代碼

    C語言實現(xiàn)掃雷附完整代碼

    本文詳細(xì)講解了C語言實現(xiàn)掃雷并附完整代碼,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • C語言仿QQ聊天界面抖動功能

    C語言仿QQ聊天界面抖動功能

    這篇文章主要為大家詳細(xì)介紹了C語言仿QQ聊天界面抖動功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11

最新評論

九龙坡区| 沙湾县| 朝阳县| 内丘县| 龙里县| 枣强县| 徐汇区| 饶平县| 华阴市| 乐都县| 龙岩市| 云龙县| 隆尧县| 印江| 凤城市| 闽侯县| 渑池县| 汕尾市| 安陆市| 张家界市| 邵武市| 宿松县| 调兵山市| 尤溪县| 基隆市| 河北区| 宁明县| 阳信县| 河曲县| 靖西县| 宝丰县| 贵南县| 马鞍山市| 昌平区| 垦利县| 东城区| 菏泽市| 达孜县| 建平县| 确山县| 嘉黎县|