亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

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

前面所提到的函數(shù)重載和通過對(duì)象名調(diào)用的虛函數(shù),在編譯時(shí)即可確定其調(diào)用的虛函數(shù)屬于哪一個(gè)類,其過程稱為靜態(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ù)時(shí)并沒有指定對(duì)象名,那么系統(tǒng)是怎樣確定關(guān)聯(lián)的呢?讀者可以看到,是通過基類指針與虛函數(shù)的結(jié)合來(lái)實(shí)現(xiàn)多態(tài)性的。先定義了一個(gè)指向基類的指針變量,并使它指向相應(yīng)的類對(duì)象,然后通過這個(gè)基類指針去調(diào)用虛函數(shù)(例如“pt->display()”)。顯然,對(duì)這樣的調(diào)用方式,編譯系統(tǒng)在編譯該行時(shí)是無(wú)法確定調(diào)用哪一個(gè)類對(duì)象的虛函數(shù)的。因?yàn)榫幾g只作靜態(tài)的語(yǔ)法檢査,光從語(yǔ)句形式(例如“pt->display();”)是無(wú)法確定調(diào)用對(duì)象的。

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

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


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

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

#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開辟動(dòng)態(tài)存儲(chǔ)空間
  delete p; //用delete釋放動(dòng)態(tài)存儲(chǔ)空間
  return 0;
}

這只是一個(gè)示意的程序。p是指向基類的指針變量,指向new開辟的動(dòng)態(tài)存儲(chǔ)空間,希望用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<<″e(cuò)xecuting Point destructor″<<endl;}

程序其他部分不改動(dòng),再運(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ù)時(shí),無(wú)論指針指的是同一類族中的哪一個(gè)類對(duì)象,系統(tǒng)會(huì)采用動(dòng)態(tài)關(guān)聯(lián),調(diào)用相應(yīng)的析構(gòu)函數(shù),對(duì)該對(duì)象進(jìn)行清理工作。

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

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

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

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

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

相關(guān)文章

最新評(píng)論