(轉(zhuǎn))虛函數(shù)和純虛函數(shù)的作用與區(qū)別

虛函數(shù)為了重載和多態(tài)的需要,在基類(lèi)中是有定義的,即便定義是空,所以子類(lèi)中可以重寫(xiě)也可以不寫(xiě)基類(lèi)中的此函數(shù)!
純虛函數(shù)在基類(lèi)中是沒(méi)有定義的,必須在子類(lèi)中加以實(shí)現(xiàn),很像java中的接口函數(shù)!

虛函數(shù)

引入原因:為了方便使用多態(tài)特性,我們常常需要在基類(lèi)中定義虛函數(shù)。

class Cman
{
public:
virtual void Eat(){……};
void Move();
private:
};
class CChild : public CMan
{
public:
virtual void Eat(){……};
private:
};
CMan m_man;
CChild m_child;
CMan *p ;//這才是使用的精髓,如果不定義基類(lèi)的指針去使用,沒(méi)有太大的意義
p = &m_man ;
p->Eat(); //始終調(diào)用CMan的Eat成員函數(shù),不會(huì)調(diào)用 CChild 的
p = &m_child;
p->Eat(); //如果子類(lèi)實(shí)現(xiàn)(覆蓋)了該方法,則始終調(diào)用CChild的Eat函數(shù)
//不會(huì)調(diào)用CMan 的 Eat 方法;如果子類(lèi)沒(méi)有實(shí)現(xiàn)該函數(shù),則調(diào)用CMan的Eat函數(shù)
p->Move(); //子類(lèi)中沒(méi)有該成員函數(shù),所以調(diào)用的是基類(lèi)中的

純虛函數(shù)

引入原因:

  • 同“虛函數(shù)”;
  • 在很多情況下,基類(lèi)本身生成對(duì)象是不合情理的。例如,動(dòng)物作為一個(gè)基類(lèi)可以派生出老虎、孔雀等子類(lèi),但動(dòng)物本身生成對(duì)象明顯不合常理。
    純虛函數(shù)就是基類(lèi)只定義了函數(shù)體,沒(méi)有實(shí)現(xiàn)過(guò)程,定義方法如: virtual void Eat() = 0; 不要
    在cpp中定義;純虛函數(shù)相當(dāng)于接口,不能直接實(shí)例話,需要派生類(lèi)來(lái)實(shí)現(xiàn)函數(shù)定義;
    有的人可能在想,定義這些有什么用啊
    ,我覺(jué)得很有用,比如你想描述一些事物的屬性給別人,而自己不想去實(shí)現(xiàn),就可以定義為純虛函數(shù)。說(shuō)的再透徹一些。比如蓋樓房,你是老板,你給建筑公司描述清楚你的樓房的特性,多少層,樓頂要有個(gè)花園什么的,建筑公司就可以按照你的方法去實(shí)現(xiàn)了,如果你不說(shuō)清楚這些,可能建筑公司不太了解你需要樓房的特性。用純需函數(shù)就可以很好的分工合作了
    虛函數(shù)和純虛函數(shù)區(qū)別

觀點(diǎn)一:
類(lèi)里聲明為虛函數(shù)的話,這個(gè)函數(shù)是實(shí)現(xiàn)的,哪怕是空實(shí)現(xiàn),它的作用就是為了能讓這個(gè)函數(shù)在它的子類(lèi)里面可以被重載,這樣的話,這樣編譯器就可以使用后期綁定來(lái)達(dá)到多態(tài)了
純虛函數(shù)只是一個(gè)接口,是個(gè)函數(shù)的聲明而已,它要留到子類(lèi)里去實(shí)現(xiàn)。

class A{
protected:
void foo();//普通類(lèi)函數(shù)
virtual void foo1();//虛函數(shù)
virtual void foo2() = 0;//純虛函數(shù)
}

觀點(diǎn)二:
虛函數(shù)在子類(lèi)里面也可以不重載的;但純虛必須在子類(lèi)去實(shí)現(xiàn),這就像Java的接口一樣。通常我們把很多函數(shù)加上virtual,是一個(gè)好的習(xí)慣,雖然犧牲了一些性能,但是增加了面向?qū)ο蟮亩鄳B(tài)性,因?yàn)槟愫茈y預(yù)料到父類(lèi)里面的這個(gè)函數(shù)不在子類(lèi)里面不去修改它的實(shí)現(xiàn)
觀點(diǎn)三:
虛函數(shù)的類(lèi)用于“實(shí)作繼承”,繼承接口的同時(shí)也繼承了父類(lèi)的實(shí)現(xiàn)。當(dāng)然我們也可以完成自己的實(shí)現(xiàn)。純虛函數(shù)的類(lèi)用于“介面繼承”,主要用于通信協(xié)議方面。關(guān)注的是接口的統(tǒng)一性,實(shí)現(xiàn)由子類(lèi)完成。一般來(lái)說(shuō),介面類(lèi)中只有純虛函數(shù)的。
觀點(diǎn)四:
帶純虛函數(shù)的類(lèi)叫虛基類(lèi),這種基類(lèi)不能直接生成對(duì)象,而只有被繼承,并重寫(xiě)其虛函數(shù)后,才能使用。這樣的類(lèi)也叫抽象類(lèi)。
虛函數(shù)是為了繼承接口和默認(rèn)行為
純虛函數(shù)只是繼承接口,行為必須重新定義

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 參考來(lái)源:知乎 定義一個(gè)函數(shù)為虛函數(shù),不代表函數(shù)為不被實(shí)現(xiàn)的函數(shù)。定義他為虛函數(shù)是為了允許用基類(lèi)的指針來(lái)調(diào)用子類(lèi)的...
    夜幕青雨閱讀 898評(píng)論 0 6
  • 繼承和多態(tài) 1. 繼承的優(yōu)缺點(diǎn) 優(yōu)點(diǎn):(1)子類(lèi)可以靈活地改變父類(lèi)中的已有方法;(2)能夠最大限度的實(shí)現(xiàn)代碼重用。...
    MinoyJet閱讀 732評(píng)論 0 0
  • 一.繼承和派生 1.概念: 基類(lèi)(父類(lèi)):原有的類(lèi) 派生類(lèi)(子類(lèi)):基于基類(lèi)新建立的類(lèi) 派生(類(lèi)的派生):在原有類(lèi)...
    YBshone閱讀 593評(píng)論 0 1
  • 虛函數(shù)為了重載和多態(tài)的需要,在基類(lèi)中是有定義的,即便定義是空,所以子類(lèi)中可以重寫(xiě)也可以不寫(xiě)基類(lèi)中的此函數(shù)! 純虛函...
    魯大帥閱讀 322評(píng)論 0 0
  • 不知不覺(jué)中,一年又要過(guò)了,每當(dāng)這個(gè)季節(jié),總會(huì)聯(lián)想起高中備考的那一幕幕。每天晚上吃過(guò)飯,望著窗外發(fā)呆,時(shí)不時(shí)的還會(huì)想...
    一杭o(jì)neline閱讀 710評(píng)論 0 0

友情鏈接更多精彩內(nèi)容