没有varselect这个函数_C++的虚函数,虚析构函数,纯虚函数
修改日期:2020/9/6
C++的虛函數(shù)
C++的虛函數(shù)的特點(diǎn)就是動(dòng)態(tài)綁定,它的意思是動(dòng)態(tài)綁定,在運(yùn)行的時(shí)候,通過(guò)引用和指針,可以用基類的類,引用繼承該c++類的派生類,雖然指針是基類,但實(shí)際上運(yùn)行的是派生類的函數(shù)。
C++虛函數(shù)可以說(shuō)是C++設(shè)計(jì)模式的基礎(chǔ)了。
有一個(gè)問(wèn)題是,有的時(shí)候在派生類中定義了一個(gè)函數(shù),這個(gè)函數(shù)與基類中的虛函數(shù)的名字一樣但是形參不一樣,這說(shuō)明兩個(gè)不是一個(gè)函數(shù)呀,這個(gè)時(shí)候,編譯器在動(dòng)態(tài)綁定的時(shí)候會(huì)報(bào)錯(cuò),他只會(huì)去找名字,卻不會(huì)去對(duì)形參。這就讓人很惱火。同時(shí),如果虛函數(shù)沒(méi)有覆寫,程序員忘了,但編譯器并不知道需要覆寫。所以C++引入了一種新的思路,那就是override,這個(gè)東西能讓編譯器發(fā)現(xiàn),如果這個(gè)函數(shù)沒(méi)有覆蓋,就會(huì)報(bào)錯(cuò)。當(dāng)然如果不是虛函數(shù),你還非要去覆蓋,也會(huì)報(bào)錯(cuò)。如果是有override,它還會(huì)自動(dòng)去匹配形參列表,如果不匹配,又是報(bào)錯(cuò):你沒(méi)有覆寫。
當(dāng)然。現(xiàn)在覆寫,不意味著以后要覆寫,因?yàn)樘摵瘮?shù)派生類可以繼承它。但有的時(shí)候,要防止后面的人對(duì)當(dāng)前的虛函數(shù)進(jìn)行覆寫,那如果我們把一個(gè)東西定義為final,則之后的任何覆蓋都是錯(cuò)誤的。
虛析構(gòu)函數(shù)
虛析構(gòu)函數(shù)解決的問(wèn)題是,因?yàn)轭愂莿?dòng)態(tài)綁定的,所以虛構(gòu)的時(shí)候可能會(huì)出現(xiàn) queue * a = Queue()的情況。(Queue是queue的派生。有可能派生類自己有一個(gè)指針,那總得釋放吧。)
這個(gè)時(shí)候,虛析構(gòu)函數(shù)不知道誰(shuí)是誰(shuí),不知道該怎么析構(gòu),這個(gè)時(shí)候就需要提供一個(gè)覆寫。
虛函數(shù)的生成,并不是不實(shí)現(xiàn)這個(gè)類了,而后面繼承它的類,這個(gè)函數(shù)都是虛函數(shù),但不一定要覆寫。虛函數(shù)主要是為了動(dòng)態(tài)綁定。在覆蓋的過(guò)程中,形參啥的要一樣,唯一可能的是,如果要返回的是自己的類型,那可以不一樣。添加一個(gè)overide也可以表示這這是一個(gè)虛函數(shù)。
派生類的派生過(guò)程,是一個(gè)向下降維的過(guò)程。基類的指針和引用可以用派生類的東西。
這是因?yàn)榕缮惖募?#xff0c;是基類和派生類的組合,可以想象那個(gè)經(jīng)典的圖,基類是一個(gè)基座部分,派生類是一個(gè)部分。派生類在處理基類的初始化的過(guò)程,是通過(guò)調(diào)用基類的構(gòu)造函數(shù)來(lái)解決的。
純虛函數(shù)
什么是抽象基類呢?是這個(gè)類中,有沒(méi)有實(shí)現(xiàn)的函數(shù),這個(gè)沒(méi)有實(shí)現(xiàn)的函數(shù)就叫做純虛函數(shù)。
純虛函數(shù)的特點(diǎn)是什么呢?就是在其后面加上一個(gè) = 0。
比如:double net_price(int ) = 0
雖然我們可以為net_price提供定義,但這個(gè)定義只能在類外提供,然后就算提供了,這個(gè)類也不能實(shí)現(xiàn),這個(gè)類只有集成它的東西,對(duì)它進(jìn)行覆寫才能實(shí)現(xiàn)。
那么繼承這個(gè)抽象基類的派生類,也可以不覆蓋這個(gè)純虛函數(shù),但代價(jià)就是,它自己也是個(gè)抽象類,兩個(gè)都不能實(shí)現(xiàn),不能變成具體的對(duì)象。
那么為什么要實(shí)現(xiàn)這個(gè)東西呢?
因?yàn)橛械臅r(shí)候,我們只是需要大家都實(shí)現(xiàn)一個(gè)相同的接口,提供相同的功能,但是,有可能這個(gè)類繼承自上一個(gè)類,那么,上一個(gè)類的有些功能就仍然存在,這會(huì)造成,當(dāng)前的對(duì)象也有使用這個(gè)功能的能力,可惜,我們根本不需要建立這個(gè)對(duì)象,這個(gè)對(duì)象只是中間的一環(huán),甚至建立這個(gè)對(duì)象是有害的。所以要有個(gè)抽象基類。
總結(jié)
以上是生活随笔為你收集整理的没有varselect这个函数_C++的虚函数,虚析构函数,纯虚函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用python画风车_python接口自
- 下一篇: mysql sum id 5_mysql