c++中虛函數(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ù)
引入原因:
1、同“虛函數(shù)”;
2、在很多情況下,基類(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í)例話(huà),需要派生類(lèi)來(lái)實(shí)現(xiàn)函數(shù)定義;
有的人可能在想,定義這些有什么用啊 ,我覺(jué)得很有用,比如你想描述一些事物的屬性給別人,而自己不想去實(shí)現(xiàn),就可以定義為純虛函數(shù)。說(shuō)的再透徹一些。比如蓋樓房,你是老板,你給建筑公司描述清楚你的樓房的特性,多少層,樓頂要有個(gè)花園什么的,建筑公司就可以按照你的方法去實(shí)現(xiàn)了,如果你不說(shuō)清楚這些,可能建筑公司不太了解你需要樓房的特性。用純需函數(shù)就可以很好的分工合作了
虛函數(shù)和純虛函數(shù)區(qū)別
觀(guān)點(diǎn)一:
類(lèi)里聲明為虛函數(shù)的話(huà),這個(gè)函數(shù)是實(shí)現(xiàn)的,哪怕是空實(shí)現(xiàn),它的作用就是為了能讓這個(gè)函數(shù)在它的子類(lèi)里面可以被重載,這樣的話(huà),這樣編譯器就可以使用后期綁定來(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ù)
}
觀(guān)點(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)
觀(guā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ù)的。
觀(guān)點(diǎn)四:
帶純虛函數(shù)的類(lèi)叫虛基類(lèi),這種基類(lèi)不能直接生成對(duì)象,而只有被繼承,并重寫(xiě)其虛函數(shù)后,才能使用。這樣的類(lèi)也叫抽象類(lèi)。
虛函數(shù)是為了繼承接口和默認(rèn)行為
純虛函數(shù)只是繼承接口,行為必須重新定義
相關(guān)文章
C語(yǔ)言中的for循環(huán)語(yǔ)句基本語(yǔ)法及使用
這篇文章主要介紹了C語(yǔ)言中的for循環(huán)語(yǔ)句基本語(yǔ)法及使用,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
C語(yǔ)言實(shí)現(xiàn)繪制貝塞爾曲線(xiàn)的函數(shù)
貝塞爾曲線(xiàn),又稱(chēng)貝茲曲線(xiàn)或貝濟(jì)埃曲線(xiàn),是應(yīng)用于二維圖形應(yīng)用程序的數(shù)學(xué)曲線(xiàn)。本文將利用C語(yǔ)言實(shí)現(xiàn)繪制貝塞爾曲線(xiàn)的函數(shù),需要的可以參考一下2022-12-12
淺談C++中對(duì)象的復(fù)制與對(duì)象之間的相互賦值
這篇文章主要介紹了淺談C++中對(duì)象的復(fù)制與對(duì)象之間的相互賦值,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
C語(yǔ)言嵌套鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言嵌套鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
Python擴(kuò)展C/C++庫(kù)的方法(C轉(zhuǎn)換為Python)
這篇文章主要介紹了Python擴(kuò)展C/C++庫(kù)的方法(C轉(zhuǎn)換為Python),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
基于一個(gè)簡(jiǎn)單定長(zhǎng)內(nèi)存池的實(shí)現(xiàn)方法詳解
本篇文章對(duì)一個(gè)簡(jiǎn)單定長(zhǎng)內(nèi)存池的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05
C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配的詳解及實(shí)例
這篇文章主要介紹了C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配的詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2016-09-09

