虛函數
在基類中將一個函數聲明為虛函數,使該函數具有虛屬性,那么其所有派生函數中該函數的重寫都具備了虛屬性,也就使得基類指針可以調用派生類實例中繼承自該基類的所有成員函數,且若有重寫,調用的都是重寫后的函數。
純虛函數
聲明純虛函數可使當前類變成抽象類,禁止該類被實例化,并要求其非抽象類的派生類必須實現該函數。
下面展示虛函數和純虛函數的代碼示例,注意觀察注釋內容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Base { public : virtual void print() = 0; //純虛函數,可以有函數體,可實例化的派生類必須重寫它 virtual void play() { //虛函數,有函數體,若派生類沒有重寫它,就原樣繼承下來 cout << "Base play!" << endl; } virtual ~Base() = 0; //純虛析構函數,必須要有函數體 //virtual ~Base(){} //很多情況下,基類的虛函數都會有函數體,將析構函數聲明為純虛函數是一種抽象化基類、不許其實例化的一種方法。 }; void Base::print() { //被聲明為純虛函數,仍可以有函數體 //但派生類若想實例化,必須重寫純虛函數,派生類中可以調用基類有函數體的純虛函數(Base::print()) cout << "Base print!" << endl; } Base::~Base(){ //被聲明為純虛析構函數,根據C++類的規則,因為其派生類析構函數會調用基類的析構函數,所以必須有函數體,否則不知道你執行了啥 } |
1、純虛函數對類最大的束縛就是:類中一旦出現純虛函數,就不可實例化了;
2、純虛函數還是可以有函數體,只不過最終還是要被派生類重寫,在派生類的函數中可以調用基類中有函數體的純虛函數;
3、為使派生類能完全釋放資源,基類析構函數必須聲明為虛函數,否則,在用基類指針new一個派生類對象后,delete該指針就只能回收與基類相關的資源,造成內存泄漏;
4、純虛析構函數必須要有函數體,根據C++析構函數的調用規則,派生類會調用基類析構函數,如果基類析構函數沒有函數體會造成函數調用失敗而報錯,這是純虛析構函數與普通純虛函數不同之處。
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!
原文鏈接:https://blog.csdn.net/qq_38755753/article/details/103298444