欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

簡要解讀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)性的。例如,新生被錄取人大學,在人學報到時,先有一名工作人員審查材料,他的職責是甄別資格,然后根據(jù)錄取通知書上注明的錄取的系和專業(yè),將材料轉(zhuǎn)到有關(guān)的系和專業(yè),辦理具體的注冊人學手續(xù),也可以看作調(diào)用不同部門的處理程序辦理入學手續(xù)。在學 生眼里,這名工作人員是總的人口,所有新生辦入學手續(xù)都要經(jīng)過他。學生拿的是統(tǒng)一的錄取通知書,但實際上分屬不同的系,要進行不同的注冊手續(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ù),應當在調(diào)用時用一定的方式告訴編譯系統(tǒng),你要調(diào)用的是哪個類對象中的函數(shù)。例如可以直接提供對象名,如studl.display()或grad1.display()。這樣編譯系統(tǒng)在對程序進行編譯時,即能確定調(diào)用的是哪個類對象中的函數(shù)。

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

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

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

前面所提到的函數(shù)重載和通過對象名調(diào)用的虛函數(shù),在編譯時即可確定其調(diào)用的虛函數(shù)屬于哪一個類,其過程稱為靜態(tài)關(guān)聯(lián)(static binding),由于是在運行前進行關(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)性的。先定義了一個指向基類的指針變量,并使它指向相應的類對象,然后通過這個基類指針去調(diào)用虛函數(shù)(例如“pt->display()”)。顯然,對這樣的調(diào)用方式,編譯系統(tǒng)在編譯該行時是無法確定調(diào)用哪一個類對象的虛函數(shù)的。因為編譯只作靜態(tài)的語法檢査,光從語句形式(例如“pt->display();”)是無法確定調(diào)用對象的。

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

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


C++虛析構(gòu)函數(shù)詳解
當派生類的對象從內(nèi)存中撤銷時一般先調(diào)用派生類的析構(gòu)函數(shù),然后再調(diào)用基類的析構(gòu)函數(shù)。但是,如果用new運算符建立了臨時對象,若基類中有析構(gòu)函數(shù),并且定義了一個指向該基類的指針變量。在程序用帶指針參數(shù)的delete運算符撤銷對象時,會發(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所指向的空間。但運行結(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;}

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

executing Circle destructor
executing Point destructor

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

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

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

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

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

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

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

相關(guān)文章

最新評論