虛函式為了過載和多型的需要,在基類中是有定義的,也可以定義為空,子類中可以重寫 也可以不寫基類中的此函式!
純虛函式在基類中是沒有定義的,必須在子類中加以實現。
虛函式
class
cman
;void
move()
;private:}
;class
cchild
:public cman
;private:}
;cman m_man;
cchild m_child;
cman *p ;
//這才是使用的精髓,如果不定義基類的指標去使用,沒有太大的意義
p =&m_man ;
//p指向父類
p->
eat();
//始終呼叫cman的eat成員函式,不會呼叫 cchild 的
p =&m_child;
//p指向子類
p->
eat();
//如果子類實現(覆蓋)了該方法,則始終呼叫cchild的eat函式
//不會呼叫cman 的 eat 方法;如果子類沒有實現該函式,則呼叫cman的eat函式
p->
move()
;//子類中沒有該成員函式,所以呼叫的是基類中的
乙個類函式的呼叫並不是在編譯時刻被確定的,而是在執行時刻被確定的。由於編寫**的時候並不能確定被呼叫的是基類的函式還是哪個派生類的函式,所以被成為"虛"函式。
int
main
(void
)
純虛函式
在很多情況下,基類本身生成物件是不合情理的。例如,動物作為乙個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。
純虛函式在基類只定義了函式體,沒有實現過程。定義方法:
virtual
void
eat()=
0;
帶純虛函式的類叫虛基類(抽象類),這種基類不能直接生成物件,只能被繼承。並重寫其虛函式後,才能使用
總結類裡宣告為虛函式的話,這個函式是實現的,哪怕是空實現,它的作用就是為了能讓這個函式在它的子類裡面可以被過載,這樣的話,這樣編譯器就可以使用後期繫結來達到多型了。
純虛函式只是乙個介面,是個函式的宣告而已,它要留到子類裡去實現。
虛函式和純虛函式
除了繼承外,c 的另乙個優良特性是支援多型,即允許將派生類的物件當作基類的物件使用。如果a是基類,b和c是a的派生類,多態函式test的引數是a的指標。那麼test函式可以引用a b c的物件。示例程式如下 class a void test a a class b public a class c...
虛函式 和 純虛函式
簡單的說,介面 就是該類的public函式。由於在類的外部一般只能通過這些公共函式才能訪問乙個類,所以這些函式就稱為類的介面。雖然乙個類也可以存在public成員資料,但是,一般不要編寫這種能夠直接在類的外部訪問的public資料,因為這樣就使資訊隱藏性受到一定的 破壞 當使用乙個基類的指標指向其乙...
純虛函式和虛函式
首先 強調乙個概念 定義乙個函式為虛函式,不代表函式為不被實現的函式。定義他為虛函式是為了允許用基類的指標來呼叫子類的這個函式。定義乙個函式為純虛函式,才代表函式沒有被實現。定義純虛函式是為了實現乙個介面,起到乙個規範的作用,規範繼承這個類的程式設計師必須實現這個函式。1 簡介 假設我們有下面的類層...