c++中虛函數和純虛函數的感化與差別。本站提示廣大學習愛好者:(c++中虛函數和純虛函數的感化與差別)文章只能為提供參考,不一定能成為您想要的結果。以下是c++中虛函數和純虛函數的感化與差別正文
虛函數為了重載和多態的須要,在基類中是有界說的,即使界說是空,所以子類中可以重寫也能夠不寫基類中的此函數!
純虛函數在基類中是沒有界說的,必需在子類中加以完成,很像java中的接口函數!
虛函數
引入緣由:為了便利應用多態特征,我們經常須要在基類中界說虛函數。
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 ;//這才是應用的精華,假如不界說基類的指針去應用,沒有太年夜的意義 p = &m_man ; p->Eat(); //一直挪用CMan的Eat成員函數,不會挪用 CChild 的 p = &m_child; p->Eat(); //假如子類完成(籠罩)了該辦法,則一直挪用CChild的Eat函數 //不會挪用CMan 的 Eat 辦法;假如子類沒有完成該函數,則挪用CMan的Eat函數 p->Move(); //子類中沒有該成員函數,所以挪用的是基類中的
純虛函數
引入緣由:
1、同“虛函數”;
2、在許多情形下,基類自己生成對象是不合道理的。例如,植物作為一個基類可以派生出山君、孔雀等子類,但植物自己生成對象顯著不合常理。
純虛函數就是基類只界說了函數體,沒有完成進程,界說辦法如: virtual void Eat() = 0; 不要 在cpp中界說;純虛函數相當於接口,不克不及直接實例話,須要派生類來完成函數界說;
有的人能夠在想,界說這些有甚麼用啊 ,我認為很有效,好比你想描寫一些事物的屬性給他人,而本身不想去完成,便可以界說為純虛函數。說的再透辟一些。好比蓋樓房,你是老板,你給修建公司描寫清晰你的樓房的特征,若干層,樓頂要有個花圃甚麼的,修建公司便可以依照你的辦法去完成了,假如你不說清晰這些,能夠修建公司不太懂得你須要樓房的特征。用純需函數便可以很好的分工協作了
虛函數和純虛函數差別
不雅點一:
類裡聲明為虛函數的話,這個函數是完成的,哪怕是空完成,它的感化就是為了能讓這個函數在它的子類外面可以被重載,如許的話,如許編譯器便可以應用前期綁定來到達多態了
純虛函數只是一個接口,是個函數的聲明罷了,它要留到子類裡去完成。
class A{ protected: void foo();//通俗類函數 virtual void foo1();//虛函數 virtual void foo2() = 0;//純虛函數 }
不雅點二:
虛函數在子類外面也能夠不重載的;但純虛必需在子類去完成,這就像Java的接口一樣。平日我們把許多函數加上virtual,是一個好的習氣,固然就義了一些機能,然則增長了面向對象的多態性,由於你很難預感到父類外面的這個函數不在子類外面不去修正它的完成
不雅點三:
虛函數的類用於“實作繼續”,繼續接口的同時也繼續了父類的完成。固然我們也能夠完成本身的完成。純虛函數的類用於“介面繼續”,重要用於通訊協定方面。存眷的是接口的同一性,完成由子類完成。普通來講,介面類中只要純虛函數的。
不雅點四:
帶純虛函數的類叫虛基類,這類基類不克不及直接生成對象,而只要被繼續,偏重寫其虛函數後,能力應用。如許的類也叫籠統類。
虛函數是為了繼續接口和默許行動
純虛函數只是繼續接口,行動必需從新界說