虛函數(shù)有什么用 什么是虛函數(shù)和純虛函數(shù),有什么區(qū)別?
什么是虛函數(shù)和純虛函數(shù),有什么區(qū)別?虛擬函數(shù)和純虛擬函數(shù)都可以在它們的子類(lèi)中重寫(xiě)。它們之間的區(qū)別在于:(1)純虛函數(shù)只有定義,沒(méi)有實(shí)現(xiàn),虛函數(shù)既有定義又有實(shí)現(xiàn)代碼。純虛函數(shù)一般沒(méi)有代碼實(shí)現(xiàn)部分,如vi
什么是虛函數(shù)和純虛函數(shù),有什么區(qū)別?
虛擬函數(shù)和純虛擬函數(shù)都可以在它們的子類(lèi)中重寫(xiě)。它們之間的區(qū)別在于:(1)純虛函數(shù)只有定義,沒(méi)有實(shí)現(xiàn),虛函數(shù)既有定義又有實(shí)現(xiàn)代碼。純虛函數(shù)一般沒(méi)有代碼實(shí)現(xiàn)部分,如virtual void print()=0,而一般虛函數(shù)必須有代碼實(shí)現(xiàn)部分,否則函數(shù)將是未定義的。Virtual void print(){printf(“this is Virtual functionn”)}(2)包含純虛函數(shù)的類(lèi)不能定義其對(duì)象,而包含虛函數(shù)的類(lèi)可以定義其對(duì)象。
虛函數(shù)和純虛函數(shù)的區(qū)別?
使用虛擬函數(shù),我們可以以一定的成本靈活地動(dòng)態(tài)綁定。如果父類(lèi)的函數(shù)(方法)不是必需的或無(wú)法實(shí)現(xiàn),并且依賴(lài)于子類(lèi)來(lái)實(shí)現(xiàn),則可以將此函數(shù)(方法)設(shè)置為虛函數(shù)名=0。我們稱(chēng)這個(gè)函數(shù)(方法)為純虛函數(shù)。換句話(huà)說(shuō),虛函數(shù)可以直接從父類(lèi)的方法繼承,而無(wú)需重寫(xiě)。但是,純虛函數(shù)是子類(lèi),必須重寫(xiě)才能使用
虛函數(shù)與純虛函數(shù)在以下幾個(gè)方面不同:(1)如果在類(lèi)中聲明虛函數(shù),則即使虛函數(shù)為空,也會(huì)實(shí)現(xiàn)該函數(shù)。它的目的是使函數(shù)能夠包含在其子類(lèi)中。這樣,編譯器就可以使用后期綁定來(lái)實(shí)現(xiàn)多態(tài)性。純虛函數(shù)只是一個(gè)接口,一個(gè)函數(shù)的聲明,需要在子類(lèi)中實(shí)現(xiàn)。(2) 虛擬函數(shù)不能在子類(lèi)中重載,但是純虛擬函數(shù)必須在子類(lèi)中實(shí)現(xiàn),就像Java接口一樣。一般來(lái)說(shuō),在許多函數(shù)中添加虛擬元素是一個(gè)好習(xí)慣。雖然犧牲了一些性能,但是面向?qū)ο蟮亩鄳B(tài)性增加了,因?yàn)楹茈y預(yù)測(cè)父類(lèi)中的函數(shù)不在子類(lèi)中,并且它的實(shí)現(xiàn)不會(huì)被修改。(3) 虛函數(shù)類(lèi)用于“實(shí)現(xiàn)繼承”,不僅繼承接口,而且繼承父類(lèi)的實(shí)現(xiàn)。當(dāng)然,你也可以完成你自己的實(shí)現(xiàn)。純虛函數(shù)注重接口的統(tǒng)一性,通過(guò)子類(lèi)實(shí)現(xiàn)。(4) 具有純虛函數(shù)的類(lèi)稱(chēng)為虛基類(lèi)。這種基類(lèi)不能直接生成對(duì)象。只有繼承并重寫(xiě)虛擬函數(shù)后才能使用。這樣的類(lèi)也稱(chēng)為抽象類(lèi)。