純虛函數是指被表明為不具體實現的虛擬成員函數。它用於這樣的情況:定義一個基類時,會遇到無法定義基類中虛函數的具體實現,其實現依賴於不同的派生類。
純虛函數定義格式
virtual 返回值類型 函數名(參數表)= 0
含有純虛函數的基類是不可以定義對象的。純虛函數無實現部分,不能產生對象,所以含有虛函數的類是抽象類。
//Test1.h #include<iostream> using namespace std; class Fish { public: virtual void water() = 0; virtual void eat() = 0; }; class Shark : public Fish { public: void water(); void eat(); }; void Shark::eat(){cout<<"Shark eat. "<<endl;} void Shark::water(){cout<<"Shark water. "<<endl;} void fun(Fish *f) { f->eat(); f->water(); }
純虛函數需要注意
1.定義純虛函數時,不能定義純虛函數的實現部分。即使是函數體為空也不可以,函數體為空就可以執行,只是什么也不做就返回。而純虛函數不能調用。
(其實可以寫純虛函數的實現部分,編譯器也可以通過,但是永遠也無法調用。因為其為抽象類,不能產生自己的對象,而且子類中一定會重寫純虛函數,因此該類的虛表內函數一定會被替換掉,所以可以說永遠也調用不到純虛函數本身)
2."=0"表明程序將不定義該函數,函數聲明是為派生類保留一個位置。“=0”的本質是將指向函數體的指針定為NULL。
3.在派生類中必須有重新定義的純虛函數的函數體,這樣的派生類才能用來定義對象。(如果不重寫進行覆蓋,程序會報錯)
//Test.cpp
#include"Test1.h" void main() { Shark s; Fish *f = &s; fun(f); }
虛表和運行結果


