帶有virtual關鍵字修飾的函式就是虛函式。
class test
;
引入虛函式,是為了使用多型的特性(通過父類指標呼叫子類重寫的方法)。
案例1:沒有使用虛函式
class animal
;class cat : public animal
;
#include "animal.h"
#include using namespace std;
void animal::eat()
void cat::eat()
#include "animal.h"
void func(animal *animal)
int main(int argc, char *ar**)
執行結果:
i'm eating generic food.
i'm eating generic food.
結論:當父類函式不是虛函式時,通過父類指標呼叫函式時,只會呼叫父類中實現的方法。
案例2:將父類函式宣告為虛函式
只需要修改animal.**件,其他檔案不用修改。
class animal
;class cat : public animal
;
執行結果:
i'm eating generic food.
i'm eating rat.
結論:只有將父類函式宣告為虛函式,才可以通過父類指標呼叫子類中重寫的方法,也就實現了多型的特性。
純虛函式是在虛函式宣告的末尾加上=0即可;
純虛函式不能有函式體,有乙個例外就是純虛析構函式(純虛析構函式可以有函式體);
含有純虛函式的類為抽象類,不能被例項化,只能被子類繼承;
抽象類除了有純虛函式外,還可以有普通函式,並且普通函式必須要有函式體。
案例:
class animal
;class cat : public animal
;
#include "animal.h"
#include using namespace std;
void animal::run()
void cat::eat()
#include "animal.h"
void func(animal *animal)
int main(int argc, char *ar**)
執行結果:
i can run.
i'm eating.
c 虛函式和純虛函式
虛函式 定義 在基類中用virtual宣告,不一定不被實現,可以用基類的指標來呼叫子類的對應函式,實現成員函式的動態過載。子類virtual可寫可不寫,編譯器自動加上。1.以下繼承後的print 相當於重寫,兩個類print 方法輸出結果不同 class a 2.加了vitual 定義為虛函式以後,...
C 虛函式和純虛函式
首先 強調乙個概念 定義乙個函式為虛函式,不代表函式為不被實現的函式。定義他為虛函式是為了允許用基類的指標來呼叫子類的這個函式。定義乙個函式為純虛函式,才代表函式沒有被實現。定義純虛函式是為了實現乙個介面,起到乙個規範的作用,規範繼承這個類的程式設計師必須實現這個函式。1 簡介 假設我們有下面的類層...
C 虛函式和純虛函式
首先 強調乙個概念 定義乙個函式為虛函式,不代表函式為不被實現的函式。定義他為虛函式是為了允許用基類的指標來呼叫子類的這個函式。定義乙個函式為純虛函式,才代表函式沒有被實現。定義純虛函式是為了實現乙個介面,起到乙個規範的作用,規範繼承這個類的程式設計師必須實現這個函式。1 簡介 假設我們有下面的類層...