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