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