虛函式和純虛函式

2021-10-25 21:30:30 字數 1316 閱讀 9328

虛函式為了過載和多型的需要,在基類中是有定義的,也可以定義為空,子類中可以重寫 也可以不寫基類中的此函式!

純虛函式在基類中是沒有定義的,必須在子類中加以實現。

虛函式

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 簡介 假設我們有下面的類層...