国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

繼承派生多態(tài)

2019-11-17 05:51:47
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
派生類(lèi)                   
派生類(lèi)概述                 
利用繼續(xù)機(jī)制,新的類(lèi)可以從已有的類(lèi)中派生(有關(guān)繼續(xù)見(jiàn)下一節(jié)“單一繼續(xù)”的開(kāi)始)。那些用于派生的類(lèi)稱(chēng)為這些非凡派生出的類(lèi)的“基類(lèi)”。派生類(lèi)的說(shuō)明可以用下面的語(yǔ)法。 
語(yǔ)法
基類(lèi)說(shuō)明::
基類(lèi)表
基類(lèi)表:
基類(lèi)說(shuō)明符
基類(lèi)表,基類(lèi)說(shuō)明符
基類(lèi)說(shuō)明符:
完全類(lèi)名稱(chēng)
virtual 訪(fǎng)問(wèn)說(shuō)明符opt 完全類(lèi)名稱(chēng) 
訪(fǎng)問(wèn)指示符 virtualopt 完全類(lèi)名稱(chēng)
訪(fǎng)問(wèn)指示符:


<<"P)aperback,M)agazine,H)elp File,C)BT"
<< endl;
char CDocType;
cin >>CDocType;
switch(tolower(CDocType))
{
case 'p':
DocLib[i]=new PaperbackBook;
break;
case 'm':
DocLib[i]=new Magazine;
break;
case 'h':
DocLib[i]=new HelpFile;
break;
case 'c':
DocLib[i]=new ComputerBasedTraining;
break;
default:
--i;
break;
}
}
for (i=0; i<10; ++i)
DocLib[i]->PrintNameOf();
}
在前面例子的SWITCH語(yǔ)句中,創(chuàng)建了不同類(lèi)型的對(duì)象。這一點(diǎn)依靠于用戶(hù)對(duì)CDocType對(duì)象所作出的說(shuō)明。然而這些類(lèi)型都是從類(lèi)Document中派生出來(lái)的,故可以隱含地轉(zhuǎn)換為Document*。結(jié)果是DocLib成為一個(gè)“相似鏈表”(heterogeneous list)。此鏈表所包含的是不同種類(lèi)的對(duì)象,其中的所有對(duì)象并不是有相同的類(lèi)型。

因?yàn)镈ocument類(lèi)有一個(gè)PrintNameOf函數(shù)。因此它能夠打印圖書(shū)館中每本書(shū)的名稱(chēng),但對(duì)于Document類(lèi)型來(lái)說(shuō)有一些信息會(huì)省略掉了(如:Book的總頁(yè)數(shù),HelpFile的字節(jié)數(shù)等)。

注重:強(qiáng)制基類(lèi)去實(shí)現(xiàn)一個(gè)如PrintNameOf的函數(shù),通常不是一個(gè)很好的設(shè)計(jì),本章后面的“虛擬函數(shù)”中提供了一個(gè)可替換的設(shè)計(jì)方法。

多重繼續(xù)

C++的后期的一些版本為繼續(xù)引入了“多重繼續(xù)”模式。在一個(gè)多重繼續(xù)的圖中,派生類(lèi)可以有多個(gè)直接基類(lèi)。考慮圖9.3。


9.3所示的圖中,顯示了一個(gè)CollectibleString類(lèi)。該類(lèi)既像Collectible類(lèi)(一種可包容聚集的類(lèi)),又像String類(lèi)。對(duì)于派生類(lèi)需要多個(gè)基類(lèi)的屬性的問(wèn)題,多重繼續(xù)是一種很好的解決辦法。因而也很輕易派生出CollectibleCustomer和CollectibleWindow等等。

對(duì)于一個(gè)特定的程序假如每個(gè)類(lèi)的屬性并不是全部要求使用,則每個(gè)類(lèi)可以單獨(dú)使用或者同別的類(lèi)聯(lián)合在一起使用。因此把圖9.3所描繪的類(lèi)層次作為基礎(chǔ),用戶(hù)很輕易組織出不可收集的字符串或可收集的非字符串。對(duì)于使用單一繼續(xù),則沒(méi)有這種便利性。

虛基類(lèi)層次 有一些類(lèi)層次很龐大,但有很多東西很普遍。這些普遍的代碼在基類(lèi)中實(shí)現(xiàn)了,然而在派生類(lèi)中又實(shí)現(xiàn)了非凡的代碼。

對(duì)于基類(lèi)來(lái)說(shuō)重要的是建立一種機(jī)制,通過(guò)這種機(jī)制派生類(lèi)能夠完成大量的函數(shù)機(jī)能。

這種機(jī)制通常是用虛函數(shù)來(lái)實(shí)現(xiàn)的。有時(shí),基類(lèi)為這些函數(shù)提供了一個(gè)缺省的實(shí)現(xiàn)。如在圖9.2的Document類(lèi)層次中,兩個(gè)重要的函數(shù)是Identify和WhereIs。當(dāng)調(diào)用Identify函數(shù)時(shí),返回一個(gè)正確的標(biāo)識(shí)。對(duì)于各種文檔來(lái)說(shuō)正確的是:對(duì)于Book,調(diào)用如doc->Identify()的函數(shù)必須返回ISBN編號(hào);而對(duì)于一個(gè)HelpFile返回產(chǎn)品名和版本號(hào)更合理一些。同樣,WhereIs函數(shù)對(duì)于一本書(shū)來(lái)說(shuō)應(yīng)該返回行和書(shū)架號(hào),但對(duì)于HelpFile就應(yīng)該返回它的磁盤(pán)位置,也許是一個(gè)目錄和名稱(chēng)。

了解到所有的Identify和WhereIs的函數(shù)實(shí)現(xiàn)返回的是同種類(lèi)型的信息,這一點(diǎn)很重要。在這個(gè)例子中,恰好是一種描述性字符串。

這些函數(shù)可以作為虛擬函數(shù)來(lái)實(shí)現(xiàn),然后用指向基類(lèi)的指針來(lái)調(diào)用,對(duì)于實(shí)際代碼的聯(lián)結(jié)將在運(yùn)行時(shí)決定,以選擇正確的Identify和WhereIs函數(shù)。

類(lèi)協(xié)議的實(shí)現(xiàn)

類(lèi)可以實(shí)現(xiàn)為要強(qiáng)制使用某些協(xié)議。這些類(lèi)稱(chēng)為“抽象類(lèi)”,因?yàn)椴荒転檫@種類(lèi)類(lèi)型創(chuàng)建對(duì)象。它們僅僅是為了派生別的類(lèi)而存在。

當(dāng)一個(gè)類(lèi)中含有純虛擬函數(shù)或當(dāng)他們繼續(xù)了某些純虛擬函數(shù)卻又沒(méi)有為它們提供一個(gè)實(shí)現(xiàn)時(shí),該類(lèi)稱(chēng)為抽象類(lèi)。純虛擬函數(shù)是用純說(shuō)明符定義的虛擬函數(shù)。如下:

virtual char *Identify()=0;

基類(lèi)Document把如下一些協(xié)議強(qiáng)加給派生類(lèi)。

* 為Identify函數(shù)提供一個(gè)合適的實(shí)現(xiàn)

* 為WhereIs函數(shù)提供一個(gè)合適的實(shí)現(xiàn)

在設(shè)計(jì)Document類(lèi)時(shí),通過(guò)說(shuō)明這種協(xié)議,類(lèi)設(shè)計(jì)者可以確保如不提供Identify和WhereIs函數(shù)則不能實(shí)現(xiàn)非抽象類(lèi)。因而Document類(lèi)含有如下說(shuō)明:

class Document
{
public:
... 
//對(duì)派生類(lèi)的要求,它們必須實(shí)現(xiàn)下面這些函數(shù)
virtual char *Identify()=0;
virtual char *WhereIs()=0;
...
};
基 類(lèi)

如前面討論的,繼續(xù)過(guò)程創(chuàng)建的新的派生類(lèi)是由基類(lèi)的成員加上由派生類(lèi)新加的成員組成。在多重繼續(xù)中,可以構(gòu)造層次圖,其中同一基類(lèi)可以是多個(gè)派生類(lèi)的一部分。圖9.4顯示了這種圖。


在圖9.4中以圖的形象表達(dá)了CollectibleString和CollectibleSortable的組成。然而,基類(lèi)Collectible通過(guò)路徑CollectibleSortable以及CollectibleString到達(dá)類(lèi)CollectibleSortableString。為了消除這種冗余,當(dāng)這些類(lèi)被繼續(xù)時(shí),可以說(shuō)明為虛擬基類(lèi)。

有關(guān)說(shuō)明虛擬基類(lèi)以及帶有虛擬基類(lèi)的對(duì)象是如何組成的,見(jiàn)本章后面的“虛擬基類(lèi)”。


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 青铜峡市| 泽州县| 邯郸县| 长春市| 衢州市| 辽宁省| 大丰市| 富平县| 防城港市| 磐安县| 兴文县| 东城区| 新沂市| 清水河县| 河曲县| 靖江市| 和政县| 陇川县| 永州市| 巨鹿县| 诸暨市| 海原县| 昌都县| 集安市| 兴宁市| 德兴市| 福海县| 武定县| 林芝县| 抚州市| 斗六市| 巴彦县| 新昌县| 句容市| 五家渠市| 从化市| 宣汉县| 通道| 永仁县| 焉耆| 泽库县|