VC++案例教程:第2章 面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)_第1頁(yè)
VC++案例教程:第2章 面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)_第2頁(yè)
VC++案例教程:第2章 面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)_第3頁(yè)
VC++案例教程:第2章 面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)_第4頁(yè)
VC++案例教程:第2章 面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第2章面向?qū)ο蟪绦蛟O(shè)計(jì) 河北經(jīng)貿(mào)大學(xué)信息技術(shù)學(xué)院2008年12月VC+案例教程VC+案例教程 北大出版社教學(xué)目標(biāo):了解面向?qū)ο蟮幕靖拍?熟練掌握類、對(duì)象、派生類的定義和使用 掌握類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的定義和特點(diǎn) 能夠利用虛函數(shù)實(shí)現(xiàn)多態(tài)性VC+案例教程 北大出版社案例介紹:案例2.1:矩形類的定義(類和對(duì)象)案例2.2:長(zhǎng)方體類的定義(繼承和派生)案例2.3:立方體、球、圓柱類的定義(多態(tài)性)VC+案例教程 北大出版社教學(xué)內(nèi)容:2.1 基本概念2.2 案例2.1 矩形類的定義與使用(類和對(duì)象)2.3 案例2.2長(zhǎng)方體類的定義與使用(繼承性與派生類) 2.4 案例2.3 立方體、球、圓柱類的定

2、義(多態(tài)性) 2.5 閱讀材料VC+案例教程 北大出版社2.1 基本概念觀點(diǎn):自然界是由實(shí)體(對(duì)象)所組成。程序設(shè)計(jì)方法:使用面向?qū)ο蟮挠^點(diǎn)來(lái)描述、模仿并處理現(xiàn)實(shí)問(wèn)題。要求:高度概括、分類、和抽象。目的:實(shí)現(xiàn)軟件設(shè)計(jì)的產(chǎn)業(yè)化。程序=多個(gè)對(duì)象+消息VC+案例教程 北大出版社類和對(duì)象對(duì)象是現(xiàn)實(shí)世界中一個(gè)實(shí)際存在的事物對(duì)象的靜態(tài)特征對(duì)象的行為類是具有相同屬性和行為的一組對(duì)象的集合,它為屬于該類的全部對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個(gè)主要部分。對(duì)象之間的交互:發(fā)送消息VC+案例教程 北大出版社封裝封裝的目的是隱藏對(duì)象的內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。通過(guò)封裝,可以將對(duì)象的外部接口與內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)分開(kāi)。

3、 目的是增強(qiáng)安全性和簡(jiǎn)化編程,使用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),而只需要通過(guò)外部接口,以特定的訪問(wèn)權(quán)限,來(lái)使用類的成員。VC+案例教程 北大出版社繼承繼承是C+中支持層次分類的一種機(jī)制,允許程序員在保持原有類特性的基礎(chǔ)上,對(duì)新類進(jìn)行更具體的說(shuō)明。實(shí)現(xiàn):聲明派生類2.3VC+案例教程 北大出版社多態(tài)性多態(tài):同一名稱,不同的功能實(shí)現(xiàn)方式。目的:標(biāo)識(shí)統(tǒng)一,減少程序中標(biāo)識(shí)符的個(gè)數(shù); 接口統(tǒng)一,增加程序的靈活性實(shí)現(xiàn):2.4編譯時(shí)的多態(tài)性:重載函數(shù)運(yùn)行時(shí)的多態(tài)性:虛函數(shù)VC+案例教程 北大出版社2.2 案例2.1 矩形類的定義與使用(類和對(duì)象)案例2.1簡(jiǎn)介本案例將定義一個(gè)矩形類(CRectangle),矩形

4、的位置和大小由左上角點(diǎn)和右下角點(diǎn)確定,因此需要先定義一個(gè)點(diǎn)類(CPoint),點(diǎn)由x坐標(biāo)和y坐標(biāo)確定。為了與后面的章節(jié)保持一致,在本例中坐標(biāo)系的規(guī)定為:以顯示器左上角為原點(diǎn),x軸向右為正,y軸向下為正。矩形類的成員函數(shù)包括計(jì)算矩形的長(zhǎng)、寬和面積等。矩形類的具體定義見(jiàn)教材VC+案例教程 北大出版社2.2.1 類的定義類是C+的靈魂,如果不真正掌握類,就不能真正掌握C+。C+中的類就是一種用戶自己定義的數(shù)據(jù)類型,和其它數(shù)據(jù)類型不同的是,組成這種類型的不僅可以有數(shù)據(jù),而且可以有對(duì)數(shù)據(jù)進(jìn)行操作的函數(shù)。VC+案例教程 北大出版社類的定義格式class 類名稱 public: 公有成員(外部接口) pri

5、vate: 私有成員 protected: 保護(hù)成員 ;類與外部的接口只允許本類中的函數(shù)訪問(wèn)(可省略)只能由本類及其派生類的成員函數(shù)訪問(wèn)是必需的成員訪問(wèn)說(shuō)明符VC+案例教程 北大出版社類名是標(biāo)識(shí)符,通常以大寫(xiě)的C字母(C表示類class)開(kāi)始,以便與對(duì)象、函數(shù)及其它數(shù)據(jù)類型相區(qū)別。類中定義的數(shù)據(jù)和函數(shù)統(tǒng)稱為類的成員,分別稱為數(shù)據(jù)成員和成員函數(shù),數(shù)據(jù)成員描述對(duì)象的屬性,而成員函數(shù)描述對(duì)象的行為。在VC+中,通常將類的聲明放在.h文件中,而將成員函數(shù)的實(shí)現(xiàn)放在與.h文件同名的.cpp文件中。在使用類的每個(gè)文件中通過(guò)#include命令包含頭文件。 說(shuō)明:VC+案例教程 北大出版社說(shuō)明:訪問(wèn)屬性可以

6、使用關(guān)鍵字public、protected和private定義類中成員的訪問(wèn)屬性。public成員(公有成員)能被任何程序訪問(wèn)。類向外界提供的接口(或服務(wù))通常聲明為public成員;private成員(私有成員)只能被該類的成員函數(shù)和友元函數(shù)訪問(wèn)。數(shù)據(jù)成員、工具函數(shù)(用于支持類中其它函數(shù)的操作)通常聲明為private成員;protected成員(保護(hù)成員)除了可以被該類的成員函數(shù)和友元函數(shù)訪問(wèn)外,還可以被該類的派生類的成員函數(shù)和友元函數(shù)訪問(wèn)。通常,將要在派生類中使用的數(shù)據(jù)成員聲明為protected成員。 VC+案例教程 北大出版社說(shuō)明:數(shù)據(jù)成員數(shù)據(jù)成員類的數(shù)據(jù)成員通常定義為private

7、成員(如類CRectangle所示),但必要時(shí)也可以定義為public成員(如類CPoint所示)。數(shù)據(jù)成員的類型可以是簡(jiǎn)單類型(如類CPoint),也可以是復(fù)雜的對(duì)象(如類CRectangle),但是數(shù)據(jù)成員的初始化必須在構(gòu)造函數(shù)中完成。VC+案例教程 北大出版社說(shuō)明:成員函數(shù)定義成員函數(shù)可以采用兩種形式定義:在類聲明中,給出成員函數(shù)的原型,而成員函數(shù)體在類的外面定義。這時(shí),成員函數(shù)名前必須加作用域運(yùn)算符“:”。如【案例2.1】中CRectangle類的成員函數(shù)Area()和Regularization()所示。將成員函數(shù)定義為內(nèi)聯(lián)函數(shù)。在類中實(shí)現(xiàn)內(nèi)聯(lián)函數(shù)有兩種方法。VC+案例教程 北大出版

8、社在類中實(shí)現(xiàn)內(nèi)聯(lián)函數(shù)的兩種方法成員函數(shù)在類的內(nèi)部定義,此時(shí)無(wú)須使用inline關(guān)鍵字,成員函數(shù)自動(dòng)為內(nèi)聯(lián)函數(shù)?!景咐?.1】中CRectangle類的成員函數(shù)GetLength()即為此種定義方法。成員函數(shù)在類內(nèi)聲明,在類外定義。但在類外定義時(shí),要加關(guān)鍵字inline。但是內(nèi)聯(lián)函數(shù)的定義必須與類聲明放在同一文件(.h)中?!景咐?.1】中CRectangle類的成員函數(shù)GetWidth()即為類外定義的內(nèi)聯(lián)函數(shù)。VC+案例教程 北大出版社說(shuō)明:const成員函數(shù)const 成員函數(shù)(只讀成員函數(shù))如果成員函數(shù)不修改數(shù)據(jù)成員的值,最好將其定義為只讀成員函數(shù),在程序中如果不小心修改了這個(gè)成員函數(shù)中

9、的對(duì)象,則編譯器會(huì)產(chǎn)生一個(gè)語(yǔ)法錯(cuò)誤信息。const 成員函數(shù)的定義方法是:在函數(shù)的原型和定義中,在函數(shù)參數(shù)表和函數(shù)定義的左花括號(hào)之間加上const關(guān)鍵字?!景咐?.1】中CRectangle類的成員函數(shù)GetLength()、GetWidth()和Area()都是const 成員函數(shù)。類的成員函數(shù)允許重載,允許帶缺省參數(shù)值。 VC+案例教程 北大出版社2.2.2 構(gòu)造函數(shù)性質(zhì):與類同名、無(wú)返回類型在對(duì)象創(chuàng)建時(shí)由系統(tǒng)自動(dòng)調(diào)用允許重載、帶缺省值如果類中未聲明,則系統(tǒng)自動(dòng)生成一個(gè)缺省形式的構(gòu)造函數(shù),形如:類名() 作用:為對(duì)象分配存儲(chǔ)空間, 對(duì)數(shù)據(jù)成員進(jìn)行初始化 VC+案例教程 北大出版社【案例2.

10、1】中的構(gòu)造函數(shù)CPoint類定義了一個(gè)帶缺省值的的構(gòu)造函數(shù),CRectangle類定義了一個(gè)無(wú)參構(gòu)造函數(shù)和兩個(gè)帶參構(gòu)造函數(shù)。如果類中含有對(duì)象成員(如類CRectangle),對(duì)象成員必須使用成員初始化值語(yǔ)法進(jìn)行初始化,即在構(gòu)造函數(shù)的參數(shù)表后面加上符號(hào) :對(duì)象名(實(shí)參表)。有多個(gè)成員初始化值時(shí),中間用逗號(hào)分隔。如果數(shù)據(jù)成員是簡(jiǎn)單類型(如類CPoint),則既可以使用賦值語(yǔ)句初始化,也可以使用成員初始化值語(yǔ)法進(jìn)行初始化。VC+案例教程 北大出版社復(fù)制構(gòu)造函數(shù)(拷貝構(gòu)造函數(shù)) 當(dāng)用類的一個(gè)對(duì)象去初始化該類的另一個(gè)對(duì)象時(shí),或?qū)㈩悓?duì)象作為函數(shù)參數(shù)按值傳遞時(shí),以及函數(shù)的返回值是類對(duì)象時(shí),系統(tǒng)將自動(dòng)調(diào)用復(fù)

11、制構(gòu)造函數(shù)完成對(duì)象的復(fù)制。復(fù)制構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),只有一個(gè)本類的引用參數(shù)。復(fù)制構(gòu)造函數(shù)的目的是生成一個(gè)對(duì)象的拷貝。VC+案例教程 北大出版社復(fù)制構(gòu)造函數(shù)的定義格式 class 類名public : 類名(類名 &對(duì)象名);/拷貝構(gòu)造函數(shù) ;類名: 類名(類名 &對(duì)象名)/拷貝構(gòu)造函數(shù)的實(shí)現(xiàn) 函數(shù)體 VC+案例教程 北大出版社復(fù)制構(gòu)造函數(shù)的定義示例為【案例2.1】中的CRectangle類定義一個(gè)復(fù)制構(gòu)造函數(shù)。CRectangle:CRectangle( const CRectangle &r) LeftTop = r.LeftTop ; RightBottom = r.RightBo

12、ttom ;VC+案例教程 北大出版社對(duì)于CPoint類,我們沒(méi)有為其定義復(fù)制構(gòu)造函數(shù),此時(shí)系統(tǒng)自動(dòng)生成一個(gè)拷貝構(gòu)造函數(shù),這種拷貝構(gòu)造函數(shù)在執(zhí)行時(shí),只是進(jìn)行簡(jiǎn)單的成員復(fù)制,這對(duì)于含有指針成員的類是非常危險(xiǎn)的,在這種情況下,必須自定義拷貝構(gòu)造函數(shù)??截悩?gòu)造函數(shù)說(shuō)明VC+案例教程 北大出版社2.2.3 析構(gòu)函數(shù)作用:是釋放對(duì)象所占的動(dòng)態(tài)內(nèi)存空間。 特點(diǎn):函數(shù)名:類名();沒(méi)有參數(shù),也不返回任何值不允許重載如果類中未定義析構(gòu)函數(shù),編譯器將自動(dòng)生成一個(gè)缺省的析構(gòu)函數(shù)。形如: 類名( ) VC+案例教程 北大出版社在下列兩種情況下會(huì)被自動(dòng)調(diào)用: 對(duì)象定義在一個(gè)函數(shù)體中,該函數(shù)調(diào)用結(jié)束后,自動(dòng)調(diào)用析構(gòu)函數(shù)

13、;用new生成的動(dòng)態(tài)對(duì)象,當(dāng)使用delete刪除時(shí),自動(dòng)調(diào)用析構(gòu)函數(shù)。通常利用析構(gòu)函數(shù)刪除對(duì)象中指針成員所指向的動(dòng)態(tài)存儲(chǔ)空間,當(dāng)類中沒(méi)有指針成員時(shí),則不需要定義析構(gòu)函數(shù)。析構(gòu)函數(shù)的調(diào)用VC+案例教程 北大出版社2.2.4 對(duì)象的定義和使用對(duì)象的定義格式: ;例如:CPoint p1( 5, 5 ); /調(diào)用帶參構(gòu)造函數(shù) CRectangle r1; /調(diào)用無(wú)參構(gòu)造函數(shù) CRectangle r2(r1); /調(diào)用復(fù)制構(gòu)造函數(shù) CRectangle *pRect; /指針對(duì)象 pRect =new CRectangle; /動(dòng)態(tài)對(duì)象,調(diào)用無(wú)參構(gòu)造函數(shù) CPoint pointArray2; /對(duì)

14、象數(shù)組pointArray,每個(gè)元素都調(diào)用無(wú)參構(gòu)造函數(shù) VC+案例教程 北大出版社對(duì)象的使用定義好對(duì)象之后,就可以使用 “.”和“-”運(yùn)算符調(diào)用類的公有成員,運(yùn)算符的使用與結(jié)構(gòu)體相同。示例如下:r1. Area( ); / 普通對(duì)象pRect - Area( ) / 指針對(duì)象VC+案例教程 北大出版社this指針在C+中為每個(gè)非靜態(tài)成員函數(shù)提供了一個(gè)名字為this的指針,當(dāng)進(jìn)行成員函數(shù)調(diào)用時(shí),系統(tǒng)自動(dòng)將調(diào)用此成員函數(shù)的對(duì)象的地址作為一個(gè)隱含的參數(shù)傳遞給this指針,即讓this指針指向調(diào)用此成員函數(shù)的對(duì)象,從而使成員函數(shù)知道該對(duì)哪個(gè)對(duì)象進(jìn)行操作。使用this指針,保證了每個(gè)對(duì)象可以擁有不同的數(shù)

15、據(jù)成員,但處理這些數(shù)據(jù)成員的代碼可以被所有的對(duì)象共享。VC+案例教程 北大出版社2.3 案例2.2長(zhǎng)方體類的定義與使用(繼承性與派生類) 案例2.2簡(jiǎn)介在定義了矩形類(CRectangle)后,只需添加一個(gè)表示高的數(shù)據(jù)就可以構(gòu)成長(zhǎng)方體。此時(shí)可以使用面向?qū)ο蟮睦^承特性,在一個(gè)已有類的基礎(chǔ)上生成新類。原有的類稱為基類(或父類),新生成的類稱為派生類(或子類)。通過(guò)類的繼承,可以提高程序的可重用性和可維護(hù)性。長(zhǎng)方體類的具體定義見(jiàn)教材VC+案例教程 北大出版社2.3.1 派生類的定義class : , , ;VC+案例教程 北大出版社說(shuō)明:如果在定義一個(gè)派生類時(shí)只有一個(gè)直接基類,稱為單繼承;否則稱為多

16、繼承。多繼承意味著一個(gè)派生類可以繼承多個(gè)基類的成員,但可能會(huì)引起大量的二義性(歧義性)問(wèn)題,所以盡量使用單繼承。繼承方式有三種:public(公有)、 private(私有)、 protected(保護(hù)),若繼承方式?jīng)]有指定,則缺省指定為public方式。繼承方式?jīng)Q定了基類成員在派生類中的訪問(wèn)權(quán)限,具體影響見(jiàn)表2-1。VC+案例教程 北大出版社說(shuō)明:繼承方式表2-1 繼承方式對(duì)派生類的影響繼承方式說(shuō) 明public(公有)基類的public和protected成員被派生類繼承后,保持原來(lái)的訪問(wèn)屬性不變private(私有)基類的public和protected成員被派生類繼承后,變成派生類的p

17、rivate成員protected(保護(hù))基類的public和protected成員被派生類繼承后,變成派生類的protected成員最常用的繼承方式是public繼承。在public繼承中,所有派生類的對(duì)象都可以作為其基類的對(duì)象來(lái)處理,基類的屬性和行為表述了基類對(duì)象和派生類對(duì)象的共性,派生類則是對(duì)其基類的具體化。 VC+案例教程 北大出版社說(shuō)明:同名覆蓋同名覆蓋:通過(guò)繼承,派生類自動(dòng)擁有其所有基類的成員,同時(shí)派生類還可以對(duì)不適合于自己的基類成員重新加以定義,例如Area()函數(shù)在基類中是求長(zhǎng)方形的面積,而在CCuboid類中則是用來(lái)求長(zhǎng)方體的表面積。在派生類中需要訪問(wèn)其基類的同名成員時(shí),必須

18、使用作用域運(yùn)算符“:”,形如基類名:成員名,如CRectangle:Area()。 VC+案例教程 北大出版社2.3.2 派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)由于派生類繼承了基類的所有成員,所以在派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)中,要負(fù)責(zé)對(duì)它們完成初始化和清除工作。由于派生類不繼承基類的構(gòu)造函數(shù)和析構(gòu)函數(shù),所以對(duì)基類成員的初始化必須通過(guò)顯式(利用成員初始化值語(yǔ)法)或隱式調(diào)用基類的構(gòu)造函數(shù)來(lái)完成。當(dāng)派生類對(duì)象的生命周期結(jié)束時(shí),也會(huì)自動(dòng)調(diào)用基類的析構(gòu)函數(shù)來(lái)完成基類成員的清理工作。 VC+案例教程 北大出版社派生類構(gòu)造函數(shù)的定義 在定義派生類的構(gòu)造函數(shù)時(shí),要利用成員初始化值語(yǔ)法顯式調(diào)用直接基類的構(gòu)造函數(shù)對(duì)基類成員進(jìn)

19、行初始化,即在派生類的構(gòu)造函數(shù)的參數(shù)表后面加上符號(hào) :基類名(實(shí)參表)。 在【案例2.2】中,派生類CCuboid的構(gòu)造函數(shù)的定義為:CCuboid:CCuboid( CPoint p1, CPoint p2, int h ) : CRectangle( p1, p2 ) / 初始化基類的數(shù)據(jù)成員 height = h 0 ? h : 1 ; CCuboid:CCuboid( int left, int top, int right, int bottom, int h ) : CRectangle( left, top, right, bottom) height = h 0 ? h : 1

20、 ; VC+案例教程 北大出版社派生類構(gòu)造函數(shù)與析構(gòu)函數(shù)的執(zhí)行順序在創(chuàng)建派生類的對(duì)象時(shí),派生類的構(gòu)造函數(shù)總是先調(diào)用其基類的構(gòu)造函數(shù)來(lái)完成基類成員的初始化。如果在基類和派生類中都包含其他類的對(duì)象(即有對(duì)象成員),則在創(chuàng)建派生類的對(duì)象時(shí),首先執(zhí)行基類的對(duì)象成員的構(gòu)造函數(shù),接著執(zhí)行基類的構(gòu)造函數(shù),然后執(zhí)行派生類的對(duì)象成員的構(gòu)造函數(shù),最后才執(zhí)行派生類的構(gòu)造函數(shù)。當(dāng)派生類對(duì)象的生命周期結(jié)束時(shí),析構(gòu)函數(shù)的執(zhí)行順序和構(gòu)造函數(shù)的執(zhí)行順序正好相反。VC+案例教程 北大出版社2.4 案例2.3 立方體、球、圓柱類的定義(多態(tài)性) 通過(guò)繼承機(jī)制,可以建立一個(gè)類族,在該類族的不同類中,可以定義同名的成員函數(shù),這些函數(shù)

21、在功能上是相似的,但其實(shí)現(xiàn)是不同的,因而通過(guò)不同類的對(duì)象去調(diào)用該函數(shù)時(shí),所引起的行為是不同的。 在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,把不同類的對(duì)象收到相同的消息時(shí)產(chǎn)生多種不同的行為方式稱為多態(tài)性。VC+案例教程 北大出版社2.4.1 兩種多態(tài)性 聯(lián)編:將一個(gè)函數(shù)調(diào)用鏈接上相應(yīng)于函數(shù)體的代碼,這一過(guò)程稱為函數(shù)聯(lián)編(簡(jiǎn)稱聯(lián)編)。靜態(tài)聯(lián)編:在編譯階段完成;優(yōu)點(diǎn)是執(zhí)行速度快動(dòng)態(tài)聯(lián)編:在運(yùn)行時(shí)才能把函數(shù)調(diào)用與函數(shù)體聯(lián)系在一起。具有靈活性高,易于擴(kuò)充和維護(hù)等優(yōu)點(diǎn),但運(yùn)行效率較低。靜態(tài)聯(lián)編所支持的多態(tài)性稱為編譯時(shí)的多態(tài)性,通過(guò)函數(shù)重載來(lái)實(shí)現(xiàn)。動(dòng)態(tài)聯(lián)編所支持的多態(tài)性稱為運(yùn)行時(shí)的多態(tài)性,通過(guò)虛函數(shù)來(lái)實(shí)現(xiàn)。VC+案例教程 北

22、大出版社2.4.2 靜態(tài)聯(lián)編【案例2.3】要求計(jì)算正方體、球和圓柱3個(gè)幾何體的表面積和體積。首先定義一個(gè)基類CBase,在該類內(nèi)定義求表面積和體積的函數(shù)。然后派生出正方體、球和圓柱3個(gè)類,在這3個(gè)類中分別定義自己的求表面積和體積的函數(shù)。類的具體定義見(jiàn)教材。 VC+案例教程 北大出版社輸出結(jié)果分析在public繼承中,所有派生類的對(duì)象都可以作為其基類的對(duì)象來(lái)處理,所以可以用基類指針指向其任何派生類的對(duì)象。當(dāng)通過(guò)基類指針對(duì)普通成員函數(shù)進(jìn)行調(diào)用時(shí),不管它實(shí)際指向的是基類對(duì)象還是指向派生類的對(duì)象,都調(diào)用在基類中定義的成員函數(shù)。也就是說(shuō),通過(guò)指針對(duì)普通成員函數(shù)的調(diào)用,僅僅由聲明指針的類型決定,而與指針當(dāng)

23、時(shí)實(shí)際指向什么對(duì)象無(wú)關(guān)。其原因在于對(duì)普通成員函數(shù)的調(diào)用,是在編譯時(shí)通過(guò)靜態(tài)聯(lián)編決定的。如果希望在程序運(yùn)行過(guò)程中根據(jù)指針實(shí)際指向的對(duì)象類型,去調(diào)用相應(yīng)類中的函數(shù),則必須使用動(dòng)態(tài)聯(lián)編。VC+案例教程 北大出版社2.4.3 虛函數(shù)虛函數(shù)是實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編的基礎(chǔ)。虛函數(shù)的聲明:在函數(shù)原型之前加virtual。class public: / 虛函數(shù)的聲明 virtual (); / 虛函數(shù)的定義 : () . VC+案例教程 北大出版社應(yīng)注意的問(wèn)題:應(yīng)該在類層次結(jié)構(gòu)中需要多態(tài)性的最高層類內(nèi)聲明虛函數(shù)。派生類中與基類虛函數(shù)原型完全相同的成員函數(shù),會(huì)自動(dòng)成為虛函數(shù)。靜態(tài)成員函數(shù)、構(gòu)造函數(shù)不能聲明為虛函數(shù)。析構(gòu)函

24、數(shù)可以聲明為虛函數(shù)。通過(guò)聲明虛函數(shù)來(lái)使用C+提供的多態(tài)性機(jī)制時(shí),派生類應(yīng)該從它的基類公有派生。 VC+案例教程 北大出版社2. 使用虛函數(shù)必須合理調(diào)用虛函數(shù)才能實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編。只有使用基類類型的指針或引用調(diào)用虛函數(shù)時(shí),系統(tǒng)才以動(dòng)態(tài)聯(lián)編方式實(shí)現(xiàn)對(duì)虛函數(shù)的調(diào)用,才能獲得運(yùn)行時(shí)的多態(tài)性。通常都用指向第一次定義虛函數(shù)的基類對(duì)象的指針或引用來(lái)調(diào)用虛函數(shù)。如果使用對(duì)象名調(diào)用虛函數(shù),系統(tǒng)仍然以靜態(tài)聯(lián)編方式完成對(duì)虛函數(shù)的調(diào)用。VC+案例教程 北大出版社抽象類對(duì)于【案例2.3】中的CBase類而言,我們無(wú)法說(shuō)出某個(gè)具體對(duì)象,這種類稱為“抽象類”。因?yàn)槌橄箢愅ǔW鳛榛惐黄渌惱^承,所以通常也把它稱為“抽象基類”。

25、抽象基類不能用來(lái)聲明對(duì)象,但是可以聲明抽象類的指針和引用,它的唯一用途是為其它類提供合適的基類,其它類可以從它這里繼承接口和(或)繼承實(shí)現(xiàn)。能夠建立實(shí)例化對(duì)象的類稱為具體類。如果類中有一個(gè)或者多個(gè)純虛函數(shù),則這個(gè)類就成為抽象類。 VC+案例教程 北大出版社3. 純虛函數(shù)純虛函數(shù):在聲明時(shí)“初始化值”為0的函數(shù)。class public:virtual ()=0;純虛函數(shù)不需要進(jìn)行定義,它只是為其所有派生類提供一個(gè)一致的接口。VC+案例教程 北大出版社class CBasepublic: virtual double area() const=0; virtual double volume()

26、 const=0;; VC+案例教程 北大出版社2.5 閱讀材料靜態(tài)類成員友元類模板VC+案例教程 北大出版社【案例2.4】靜態(tài)類成員和友元函數(shù)的使用本案例使用CPoint類來(lái)演示靜態(tài)類成員和友元函數(shù)的使用,在該類中添加了一個(gè)私有訪問(wèn)屬性的靜態(tài)數(shù)據(jù)成員NumOfObject,用來(lái)記錄程序中已生成的對(duì)象的個(gè)數(shù),通過(guò)公有靜態(tài)成員函數(shù)GetNumOfObject()來(lái)訪問(wèn)。NumOfObject的變化由構(gòu)造函數(shù)和析構(gòu)函數(shù)來(lái)完成。通過(guò)友元函數(shù)來(lái)實(shí)現(xiàn)CPoint類對(duì)象的輸入和輸出。具體實(shí)現(xiàn)教材 VC+案例教程 北大出版社2.5.1 靜態(tài)類成員 有時(shí)類的所有對(duì)象需要共享一個(gè)數(shù)據(jù),這時(shí)可以使用靜態(tài)類成員。如

27、果類的數(shù)據(jù)成員或成員函數(shù)使用關(guān)鍵字static進(jìn)行修飾,這樣的成員稱為靜態(tài)數(shù)據(jù)成員或靜態(tài)成員函數(shù),統(tǒng)稱為靜態(tài)類成員。由于數(shù)據(jù)隱藏的需要,靜態(tài)數(shù)據(jù)成員通常被聲明為私有的,而通過(guò)定義公有的靜態(tài)成員函數(shù)來(lái)訪問(wèn)靜態(tài)數(shù)據(jù)成員。下面程序段示例了靜態(tài)類成員的定義。 VC+案例教程 北大出版社靜態(tài)類成員的定義class CPointpublic: static int GetNumOfObject(); / 靜態(tài)成員函數(shù)聲明private: static int NumOfObject; / 靜態(tài)數(shù)據(jù)成員定義;int CPoint:NumOfObject=0; / 靜態(tài)數(shù)據(jù)成員的初始化,必須放在文件作用域內(nèi)i

28、nt CPoint:GetNumOfObject() / 靜態(tài)成員函數(shù)定義 return NumOfObject; VC+案例教程 北大出版社說(shuō)明:靜態(tài)數(shù)據(jù)成員必須在文件作用域內(nèi)進(jìn)行初始化,靜態(tài)成員遵循類的其它成員所遵循的訪問(wèn)限制。靜態(tài)成員函數(shù)沒(méi)有this指針,即使在類還沒(méi)有實(shí)例化任何對(duì)象時(shí),靜態(tài)成員就已經(jīng)存在并可使用。靜態(tài)類成員的訪問(wèn):在類作用域內(nèi),任何成員函數(shù)都可以直接訪問(wèn)靜態(tài)成員。而在類作用域外,只能訪問(wèn)public靜態(tài)成員,訪問(wèn)方法有以下兩種:使用對(duì)象名或?qū)ο笾羔槪鏿1.GetNumOfObject()或pPoint-GetNumOfObject()使用類名和作用域運(yùn)算符“:”對(duì)其進(jìn)行訪問(wèn),例

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論