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

首頁 > 學院 > 開發設計 > 正文

類繼承

2019-11-11 01:38:21
字體:
來源:轉載
供稿:網友

常見為公有派生:

class RatedPlayer : public TableTennisPlayer

{..}

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

創建派生類對象時,首先調用基類構造函數,然后再調用派生類的構造函數。基類構造函數負責初始化繼承的數據成員,派生類構造函數主要用于初始化新增的數據成員。派生類的構造函數總是調用一個基類的構造函數。可以使用初始化列表語法指明要使用的基類構造函數,否則將使用默認的基類構造函數。

派生類對象過期時,先調用派生類的析構函數,再調用基類析構函數。

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

基類指針可以在不進行顯式類型轉換的情況下指向派生類對象;基類引用可以在不進行顯式類型轉換的情況下引用派生類對象,但不能反過來,即不能將基類對象和地址賦給派生類引用或指針?;愔羔樆蛞弥荒苡糜谡{用基類方法(聲明了虛方法后,可以用于調用同名覆蓋的派生類方法)。

公有繼承是一種is-a關系。

虛函數——多態重要機制:在方法聲明前加上virtual關鍵字,聲明為虛方法,則它在派生類中將自動成為虛方法。然而在派生類中最好也加上virtual聲明指出來,看著方便。virtual只用于類聲明的方法原型中,定義中不需要。

如果沒有使用虛方法,在調用同名的方法時,程序將根據引用類型或指針類型選擇方法;如果使用了虛方法,程序將根據引用或指針指向的對象的類型來選擇方法。

通常,基類需要聲明虛析構函數。如果析構函數不是虛的,則將只調用對應于指針類型的析構函數,即使其指向的是派生類對象。因此為確保正確釋放派生對象時,按正確的順序調用析構函數,需要聲明虛析構函數。

編譯器對非虛方法使用靜態聯編,即在編譯時就能確定使用的是哪一個函數;對虛方法使用動態聯編,即在程序運行時選擇使用哪一個函數。為避免額外的處理開銷,默認為靜態聯編。所謂的開銷是指在內存和執行速度方面有一定的成本:

1、每個對象都將增大,增大量為存儲地址的空間;

2、對于每個類,編譯器都創建一個虛函數地址表(數組);

3、對于每個函數調用,都需要執行一項額外的操作,即到表中查找地址。

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

構造函數不能是虛函數。創建派生類對象時,將調用派生類的構造函數,然后其將使用基類的一個構造函數,這種順序不同于繼承機制。因此,派生類并不繼承基類的構造函數。

析構函數應當是虛函數,即使它不執行任何操作,除非類不用做基類。

友元不能是虛函數,因為友元不是類成員,只有成員函數才能是虛函數。

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

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

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

抽象基類:

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

如果在派生類中仍沒有實現純虛函數定義,則仍為抽象類,不能實例化。

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄂温| 和林格尔县| 西充县| 澜沧| 新乡市| 灵石县| 甘泉县| 裕民县| 武城县| 怀化市| 石河子市| 广平县| 南漳县| 柘城县| 海宁市| 阜阳市| 牡丹江市| 淮阳县| 和林格尔县| 卓资县| 华池县| 盐津县| 辉南县| 赤壁市| 两当县| 新宾| 耿马| 扎兰屯市| 普格县| 峨眉山市| 桐庐县| 阜宁县| 余姚市| 高陵县| 宣汉县| 四会市| 伊通| 华阴市| 甘孜县| 洛阳市| 蒙自县|