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

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

類繼承

2019-11-11 00:11:59
字體:
供稿:網(wǎng)友

常見為公有派生:

class RatedPlayer : public TableTennisPlayer

{..}

冒號(hào)表明,RatedPlayer的基類是TableTennisPlayer。使用公有派生,基類的公有部分將稱為派生類的公有部分,基類的私有部分將稱為派生類的一部分,但不能被派生類直接訪問,只能通過基類的公有和保護(hù)方法訪問。派生類需要自己的構(gòu)造函數(shù),并根據(jù)需要添加額外的數(shù)據(jù)成員和成員函數(shù)。

創(chuàng)建派生類對(duì)象時(shí),首先調(diào)用基類構(gòu)造函數(shù),然后再調(diào)用派生類的構(gòu)造函數(shù)。基類構(gòu)造函數(shù)負(fù)責(zé)初始化繼承的數(shù)據(jù)成員,派生類構(gòu)造函數(shù)主要用于初始化新增的數(shù)據(jù)成員。派生類的構(gòu)造函數(shù)總是調(diào)用一個(gè)基類的構(gòu)造函數(shù)。可以使用初始化列表語法指明要使用的基類構(gòu)造函數(shù),否則將使用默認(rèn)的基類構(gòu)造函數(shù)。

派生類對(duì)象過期時(shí),先調(diào)用派生類的析構(gòu)函數(shù),再調(diào)用基類析構(gòu)函數(shù)。

使用派生類程序必須能夠訪問到基類。由于兩個(gè)類是相關(guān)的,一般將他們的聲明放在同一個(gè).h文件中。

基類指針可以在不進(jìn)行顯式類型轉(zhuǎn)換的情況下指向派生類對(duì)象;基類引用可以在不進(jìn)行顯式類型轉(zhuǎn)換的情況下引用派生類對(duì)象,但不能反過來,即不能將基類對(duì)象和地址賦給派生類引用或指針。基類指針或引用只能用于調(diào)用基類方法(聲明了虛方法后,可以用于調(diào)用同名覆蓋的派生類方法)。

公有繼承是一種is-a關(guān)系。

虛函數(shù)——多態(tài)重要機(jī)制:在方法聲明前加上virtual關(guān)鍵字,聲明為虛方法,則它在派生類中將自動(dòng)成為虛方法。然而在派生類中最好也加上virtual聲明指出來,看著方便。virtual只用于類聲明的方法原型中,定義中不需要。

如果沒有使用虛方法,在調(diào)用同名的方法時(shí),程序?qū)⒏鶕?jù)引用類型或指針類型選擇方法;如果使用了虛方法,程序?qū)⒏鶕?jù)引用或指針指向的對(duì)象的類型來選擇方法。

通常,基類需要聲明虛析構(gòu)函數(shù)。如果析構(gòu)函數(shù)不是虛的,則將只調(diào)用對(duì)應(yīng)于指針類型的析構(gòu)函數(shù),即使其指向的是派生類對(duì)象。因此為確保正確釋放派生對(duì)象時(shí),按正確的順序調(diào)用析構(gòu)函數(shù),需要聲明虛析構(gòu)函數(shù)。

編譯器對(duì)非虛方法使用靜態(tài)聯(lián)編,即在編譯時(shí)就能確定使用的是哪一個(gè)函數(shù);對(duì)虛方法使用動(dòng)態(tài)聯(lián)編,即在程序運(yùn)行時(shí)選擇使用哪一個(gè)函數(shù)。為避免額外的處理開銷,默認(rèn)為靜態(tài)聯(lián)編。所謂的開銷是指在內(nèi)存和執(zhí)行速度方面有一定的成本:

1、每個(gè)對(duì)象都將增大,增大量為存儲(chǔ)地址的空間;

2、對(duì)于每個(gè)類,編譯器都創(chuàng)建一個(gè)虛函數(shù)地址表(數(shù)組);

3、對(duì)于每個(gè)函數(shù)調(diào)用,都需要執(zhí)行一項(xiàng)額外的操作,即到表中查找地址。

虛函數(shù)表中存儲(chǔ)了為類對(duì)象進(jìn)行聲明的虛函數(shù)的地址。例如,基類對(duì)象包含一個(gè)指針(形如隱藏的成員),指向基類中所有虛函數(shù)的地址表。派生類對(duì)象將包含一個(gè)指向獨(dú)立地址表的指針。如果派生類提供了虛函數(shù)的新定義,該表將保存新函數(shù)的地址;如果沒有重新定義虛函數(shù),該表將保存函數(shù)原始版本的地址。如果派生類定義了新的虛函數(shù),則該函數(shù)的地址也被添加到該表中。

構(gòu)造函數(shù)不能是虛函數(shù)。創(chuàng)建派生類對(duì)象時(shí),將調(diào)用派生類的構(gòu)造函數(shù),然后其將使用基類的一個(gè)構(gòu)造函數(shù),這種順序不同于繼承機(jī)制。因此,派生類并不繼承基類的構(gòu)造函數(shù)。

析構(gòu)函數(shù)應(yīng)當(dāng)是虛函數(shù),即使它不執(zhí)行任何操作,除非類不用做基類。

友元不能是虛函數(shù),因?yàn)橛言皇穷惓蓡T,只有成員函數(shù)才能是虛函數(shù)。

如果派生類沒有重新定義函數(shù),將使用該函數(shù)的基類版本。如果派生類位于派生鏈中,則將使用最新的虛函數(shù)版本,例外情況是基類版本是隱藏的(被覆蓋)。

如果派生類有重新定義函數(shù),不會(huì)生成函數(shù)的兩個(gè)重載版本,而是隱藏了基類版本。將不是使用相同的函數(shù)特征標(biāo)覆蓋基類聲明,而是隱藏同名的基類方法,不管參數(shù)特征標(biāo)如何。

PRotect成員表示,派生類的成員可以直接訪問基類的保護(hù)成員,但不能訪問基類的私有成員。即,對(duì)于外部世界來說,保護(hù)成員的行為與私有成員類似;而對(duì)于派生類來說,保護(hù)成員的行為與公有成員相似。

抽象基類:

通過純虛函數(shù)提供未實(shí)現(xiàn)的函數(shù)。純虛函數(shù)的聲明前面為virtual關(guān)鍵字,結(jié)尾處為 = 0(如果有const,則結(jié)尾為const = 0)。當(dāng)類聲明包含純虛函數(shù)時(shí),則不能創(chuàng)建該類的對(duì)象。這里的理念是,包含純虛函數(shù)的類只能用作基類,即抽象基類。抽象基類至少包含一個(gè)純虛函數(shù)。在類中允許不定義純虛函數(shù)。

如果在派生類中仍沒有實(shí)現(xiàn)純虛函數(shù)定義,則仍為抽象類,不能實(shí)例化。

抽象基類(或叫ABC)看作是一種必須實(shí)施的接口。ABC要求具體派生類覆蓋其純虛函數(shù)——迫使派生類遵循ABC設(shè)置的接口規(guī)則,即接口約定。這樣確保了從ABC派生的所有組件都至少支持ABC指定的功能。

繼承和動(dòng)態(tài)內(nèi)存分配的問題:假設(shè)基類成員包含指針,構(gòu)造函數(shù)使用了動(dòng)態(tài)內(nèi)存分配(即new),且聲明中包含了構(gòu)造函數(shù)使用new時(shí)需要的特殊方法:析構(gòu)函數(shù)、復(fù)制構(gòu)造函數(shù)和重載賦值運(yùn)算符。如果派生類不使用new,則不再需要為派生類定義顯式析構(gòu)函數(shù)、復(fù)制構(gòu)造函數(shù)和賦值運(yùn)算符。反之,如果派生類使用了new,則必須為派生類定義顯式析構(gòu)函數(shù)、復(fù)制構(gòu)造函數(shù)和賦值運(yùn)算符。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南丹县| 金昌市| 尼勒克县| 聂荣县| 德安县| 库尔勒市| 华亭县| 台东县| 尼玛县| 清原| 鄯善县| 招远市| 衡东县| 周口市| 枝江市| 诸暨市| 兴和县| 连云港市| 鱼台县| 定远县| 马公市| 海伦市| 山丹县| 太和县| 永吉县| 封开县| 松潘县| 阿尔山市| 涪陵区| 罗平县| 镇安县| 新沂市| 佛教| 塘沽区| 屯门区| 射阳县| 湛江市| 科技| 苍溪县| 西藏| 会同县|