C++ 虚函数和纯虚函数
C++中這兩個概念不容易區(qū)分。
首先這兩個函數(shù)都是為了方便使用多態(tài)這種面向?qū)ο蟮奶匦浴O旅鎸⒔榻B兩個函數(shù)的不同點。
?
虛函數(shù):
一個類中定義了虛函數(shù),通過指向派生類的基類指針,訪問派生類中同名覆蓋成員函數(shù),也就是說派生類要實現(xiàn)基類中的虛函數(shù)。而且于基類中的虛函數(shù)有著不同的過程。但是在內(nèi)存中如何實現(xiàn)的多態(tài)呢?
這里我們要說一下關(guān)于虛函數(shù)在內(nèi)存中實現(xiàn),首先,有一種被稱為 vptr(virtual table pointer,虛函數(shù)表指針)的指針,指向一個表,vtbl(virtual table,虛函數(shù)表),表里面就是這個類的虛函數(shù)的地址。在實例化一個對象的時候,vptr和vtbl將會存到類里,也就是,如果類定義了虛函數(shù),該類及其派生類就要生成一張?zhí)摂M函數(shù)表,即vtable。而在類的對象地址空間中存儲一個該虛表的入口。當(dāng)我們使用派生類調(diào)用虛函數(shù)的時候,派生類就會找到這個入口從而調(diào)用已經(jīng)實現(xiàn)的虛函數(shù),當(dāng)我們使用基類調(diào)用虛函數(shù)的時候,基類就會找到自己的虛表的入口,然后調(diào)用自己的虛函數(shù),這樣就實現(xiàn)了多態(tài)。當(dāng)然,虛函數(shù)的存在顯得對象很“臃腫”,會損失性能,這也是虛函數(shù)實現(xiàn)多態(tài)的一個缺點。
純虛函數(shù):
許多情況下,在基類中不能對虛函數(shù)給出有意義的實現(xiàn),而把它聲明為純虛函數(shù),它的實現(xiàn)留給該基類的派生類去做。這時純虛函數(shù)就像是一個沒有一個實現(xiàn)的虛函數(shù)。但是有一點不同的是,存在純虛函數(shù)的類不能夠被實例化。存在純虛函數(shù)的類就像java中的interface,同樣是作為一種規(guī)范?,F(xiàn)在來看感覺純虛函數(shù)的出現(xiàn)并沒有太多的意義。試想,有些類中的函數(shù)我們真的沒有辦法去描述他的過程,也真的沒辦法實例化。比如,我們定義cat,dog,human類派生于animal類,我們可以實例化他們,但是我們?nèi)绾螌嵗痑nimal?這就是純虛函數(shù)存在的原因。純虛函數(shù)所在的類不能實例化,所以在內(nèi)存中是不存在純虛函數(shù)的,只有純虛函數(shù)被重寫成虛函數(shù)時才出現(xiàn)在內(nèi)存中。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/yujinghui/archive/2012/09/20/2695860.html
總結(jié)
以上是生活随笔為你收集整理的C++ 虚函数和纯虚函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: date制作电子时钟
- 下一篇: 关键字static在C和C++中的区别