圖7-1形狀對(duì)外公開(kāi)一個(gè)函數(shù)來(lái)把自己繪制出來(lái)。這是合理的,形狀就應(yīng)該能繪制出來(lái),對(duì)吧?由于繼承的原因,多邊形和圓形也有了繪制自己這個(gè)函數(shù)。現(xiàn)在我們來(lái)討論在這三個(gè)類中的繪制自己的函數(shù)都應(yīng)該怎么實(shí)現(xiàn)。在形狀中嘛,什么也不做就行了。在多邊形中嘛,只要把它所有的頂點(diǎn)首尾相連起來(lái)就行了。在圓形中嘛,依據(jù)它的圓心和它的半徑畫(huà)一個(gè)360度的圓弧就行了。可是現(xiàn)在的問(wèn)題是:多邊形和圓形的繪制自己的函數(shù)是從形狀繼承而來(lái)的,并不能做連接頂點(diǎn)和畫(huà)圓弧的工作。怎 么辦呢?覆蓋它,覆蓋形狀中的繪制自己這個(gè)函數(shù)。于是我們?cè)诙噙呅魏蛨A形中各做一個(gè)繪制自己的函數(shù),覆蓋形狀中的繪制自己的函數(shù)。為了實(shí)現(xiàn)覆蓋,我們需要 把形狀中的繪制自己這個(gè)函數(shù)用virtual修飾。而且形狀中的繪制自己這個(gè)函數(shù)什么也不干,我們就把它做成一個(gè)純虛函數(shù)。純虛函數(shù)還有一個(gè)作用,就是讓 它所在的類成為抽象類。形狀理應(yīng)是一個(gè)抽象類,不是嗎?于是我們很快寫(xiě)出這三個(gè)類的代碼如下:class Shape//形狀{public: virtualvoid DrawSelf()//繪制自己 { cout << "我是一個(gè)什么也繪不出的圖形" << endl; }}; class Polygo:public Shape//多邊形{public: void DrawSelf() //繪制自己 { cout << "連接各頂點(diǎn)" << endl; }}; class Circ:public Shape//圓{public: void DrawSelf() //繪制自己 { cout << "以圓心和半徑為依據(jù)畫(huà)弧" << endl; }};下面,我們將以上面的這三個(gè)類為基礎(chǔ)來(lái)說(shuō)明動(dòng)態(tài)多態(tài)。在進(jìn)行更進(jìn)一步的說(shuō)明之前,我們先來(lái)說(shuō)一個(gè)不得不說(shuō)的兩個(gè)概念:“子類型”和“向上轉(zhuǎn)型”。| 歡迎光臨 (http://www.denmoz.com/bbs/) | Powered by Discuz! X3.1 |