一、虛函數的基本概念
虛函數是C++中用於實現多態的機制之一,它能夠讓我們在基類中定義函數,而在派生類中進行重寫,讓程序在運行時根據對象所屬的實際類型來調用相應的函數。
C++的虛函數的應用場景主要在於,我們定義一個基類,然後在派生類中重寫相應的虛函數,可以使得程序能夠更加靈活,根據具體的需求來調用不同的函數。比如,在一個動物類中定義虛函數eat()和sleep(),然後在派生類中定義不同類型的動物比如狗類和貓類,並分別實現eat()和sleep()函數,就可以根據實際需要來使用這些函數了。
虛函數的定義:在基類中的虛函數,可以在其後面添加關鍵字virtual,表示這是一個虛函數。
class Animal { public: virtual void eat(); virtual void sleep(); };
二、純虛函數的定義
純虛函數是一種沒有實現的虛函數。在基類中定義一個純虛函數,其語法與虛函數基本相同,但是在函數的後面加上了=0。
定義純虛函數的主要目的是為了讓派生類必須實現這個函數,為了達到這個目的,我們不能在聲明的時候直接將純虛函數賦值為0,只能在具體的派生類中實現這個函數。如果某個派生類沒有實現這個純虛函數,那麼該派生類也會變成抽象類,無法實例化。
純虛函數的定義:
class Animal { public: virtual void eat() = 0; virtual void sleep() = 0; };
三、虛函數與純虛函數的區別
1. 虛函數與純虛函數的定義方式不同
虛函數的定義在函數的聲明中添加virtual關鍵字即可,而定義一個純虛函數在函數聲明後面加上=0
// 定義虛函數 virtual void eat(); // 定義純虛函數 virtual void eat() = 0;
2. 純虛函數是抽象類的標記
對於含有純虛函數的類,稱為抽象類。在抽象類中,由於沒有實現純虛函數,所以無法創建該抽象類的實例。
虛函數不需要被實現,可以被覆蓋或不被覆蓋。
class Animal { public: virtual void eat() = 0; // 純虛函數 virtual void sleep(); // 虛函數 };
3. 實現方式不同
派生類中對於純虛函數和虛函數的實現方式都是不一樣的。純虛函數必須在派生類中被實現,而虛函數可選擇是否實現。否則,當該虛函數被調用時,將會執行基類的版本。
class Dog : public Animal { public: virtual void eat() { // 狗類的具體實現 } virtual void sleep() { // 狗類的具體實現 } };
4. 區別體現在內存布局上
虛函數會為每個包含虛函數的對象添加一個虛函數表指針,指向一個全局的虛函數表(Virtual Table),維護虛函數指針及其所指向的函數的關係。
而對於純虛函數來說,虛函數表中沒有其對應的函數地址,只是一個空指針,這也是純虛函數無法被直接調用的原因。
四、總結
在實際應用中,虛函數和純虛函數都有各自的優劣。虛函數能夠提供默認實現,不完全由派生類重寫,而純虛函數則能夠確保派生類實現了該函數,讓程序更加穩定。我們應該根據具體需求來選擇使用哪種方式。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/191172.html