c++中虚函数和纯虚函数定义
只有用virtual聲明類的成員函數(shù),使之成為虛函數(shù),不能將類外的普通函數(shù)聲明為虛函數(shù)。因為虛函數(shù)的作用是允許在派生類中對基類的虛函數(shù)重新定義。所以虛函數(shù)只能用于類的繼承層次結構中。
? ? ?一個成員函數(shù)被聲明為虛函數(shù)后,在同一類族中的類就不能再定義一個非virtual的但與該虛函數(shù)具有相同的參數(shù)(包括個數(shù)和類型)和函數(shù)返回值類型的同名函數(shù)。
? ? ? ?根據(jù)什么考慮是否把一個成員函數(shù)聲明為虛函數(shù)?
? ? ? ?① ?看成員函數(shù)所在的類是否會作為基類
? ? ? ?② 看成員函數(shù)在類的繼承后有無可能被更改功能,如果希望更改其功能的,一般應該將它聲明為虛函數(shù)。
? ? ? ?如果成員函數(shù)在類被繼承后功能不需修改,或派生類用不到該函數(shù),則不要把它聲明為虛函數(shù)。不要僅僅考慮到作為基類而把類中的所有成員函數(shù)都聲明為虛函數(shù)。
? ? ? 應考慮對成員函數(shù)的調用是通過對象名還是通過基類指針或引用去訪問,如果是通過基類指針或引用去訪問的,則應當聲明為虛函數(shù)。有時在定義虛函數(shù)時,并不定義其函數(shù)體,即純虛函數(shù)。它的作用只是定義了一個虛函數(shù)名,具體功能留給派生類去添加。
? ? ? 說明:使用虛函數(shù),系統(tǒng)要有一定的空間開銷。當一個類帶有虛函數(shù)時,編譯系統(tǒng)會為該類構造一個虛函數(shù)表(vtbl),它是一個指針數(shù)組,存放每個虛函數(shù)的入口地址。系統(tǒng)在進行動態(tài)關聯(lián)的時間開銷很少,提高了多態(tài)性的效率。
一、虛析構函數(shù)
? ? ? 析構函數(shù)的作用是在對象撤銷之前把類的對象從內存中撤銷。通常系統(tǒng)只會執(zhí)行基類的析構函數(shù),不執(zhí)行派生類的析構函數(shù)。
? ? ? 只需要把基類的析構函數(shù)聲明為虛函數(shù),即虛析構函數(shù),這樣當撤銷基類對象的同時也撤銷派生類的對象,這個過程是動態(tài)關聯(lián)完成的。
? ? ? 如果將基類的析構函數(shù)聲明為虛函數(shù)時,由該基類所派生的所有派生類的析構函數(shù)都自動成為虛函數(shù),即使派生類的析構函數(shù)與基類的析構函數(shù)名字不相同。
? ? ? ?最好把基類的析構函數(shù)聲明為虛函數(shù),這將使所有派生類的析構函數(shù)自動成為虛函數(shù),如果程序中顯式delete運算符刪除一個對象,而操作對象用了指向派生類對象的基類指針,系統(tǒng)會調用相應類的析構函數(shù)。
? ???構造函數(shù)不能聲明為虛函數(shù)。
?
二、純虛函數(shù)
? ? ? ? 有時候,基類中的虛函數(shù)是為了派生類中的使用而聲明定義的,其在基類中沒有任何意義。此類函數(shù)我們叫做純虛函數(shù),不需要寫成空函數(shù)的形式,只需要聲明成:
? ??? virtual 函數(shù)類型 函數(shù)名(形參表列)=0;
? ? ? ?注意:純虛函數(shù)沒有函數(shù)體;
? ? ? 最后面的“=0“并不代表函數(shù)返回值為0,只是形式上的作用,告訴編譯系統(tǒng)”這是純虛函數(shù)”;
? ? ? 這是一個聲明語句,最后應有分號。
? ? ?純虛函數(shù)只有函數(shù)的名字但不具備函數(shù)的功能,不能被調用。在派生類中對此函數(shù)提供定義后,才能具備函數(shù)的功能,可以被調用。
總結
以上是生活随笔為你收集整理的c++中虚函数和纯虚函数定义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c/c++头文件中#ifndef/#de
- 下一篇: C++中函数参数形式的总结