1. 虛函數和純虛函數可以定義在同一個類(class)中,含有純虛函數的類被稱爲抽象類(abstract class),而只含有虛函數的類(class)不能被稱爲抽象類(abstract class)。
2. 虛函數可以被直接使用,也可以被子類(sub class)重載以後以多態的形式調用,而純虛函數必須在子類(sub class)中實現該函數纔可以使用,因爲純虛函數在基類(base class)只有聲明而沒有定義。
3. 虛函數和純虛函數都可以在子類(sub class)中被重載,以多態的形式被調用。
4. 虛函數和純虛函數通常存在於抽象基類(abstract base class -ABC)之中,被繼承的子類重載,目的是提供一個統一的接口。
5. 虛函數的定義形式:virtual {method body}
純虛函數的定義形式:virtual { } = 0;
在虛函數和純虛函數的定義中不能有static標識符,原因很簡單,被static修飾的函數在編譯時候要求前期bind,然而虛函數卻是動態綁定(run-time bind),而且被兩者修飾的函數生命週期(life recycle)也不一樣。
6. 虛函數必須實現,如果不實現,編譯器將報錯,錯誤提示爲:
error LNK****: unresolved external symbol "public: virtual void __thiscall
ClassName::virtualFunctionName(void)"
7. 對於虛函數來說,父類和子類都有各自的版本。由多態方式調用的時候動態綁定。
8. 實現了純虛函數的子類,該純虛函數在子類中就編程了虛函數,子類的子類即孫子類可以覆蓋
該虛函數,由多態方式調用的時候動態綁定。
9. 虛函數是C++中用於實現多態(polymorphism)的機制。核心理念就是通過基類訪問派生類定義的
函數
10. 多態性指相同對象收到不同消息或不同對象收到相同消息時產生不同的實現動作。C++支持兩種多態性:編譯時多態性,運行時多態性。
a.編譯時多態性:通過重載函數實現
b 運行時多態性:通過虛函數實現。
11. 如果一個類中含有純虛函數,那麼任何試圖對該類進行實例化的語句都將導致錯誤的產生,因爲抽象基類(ABC)是不能被直接調用的。必須被子類繼承重載以後,根據要求調用其子類的方法。
1 //father class 2 3 class Virtualbase 4 5 { 6 7 public: 8 9 virtual void Demon()= 0; //prue virtual function 10 11 virtual void Base() {cout<<"this is farther class"<}; 12 13 } 14 15 //sub class 16 17 class SubVirtual :public Virtualbase 18 19 { 20 21 public: 22 23 void Demon() { cout<<" this is SubVirtual!"< 24 25 void Base() { cout<<"this is subclass Base"< 26 27 } 28 29 /* 30 31 instance class and sample 32 33 */ 34 35 void main() 36 37 { 38 39 Virtualbase* inst = new SubVirtual(); //multstate pointer 40 41 inst->Demon(); 42 43 inst->Base(); 44 45 // inst = new Virtualbase(); 46 47 // inst->Base() 48 49 return ; 50 51 }
參考:
1. http://blog.csdn.net/wuchuanpingstone/article/details/6742465
這篇文章分析了虛函數的底層實現,大家可以看看。
2. http://blog.sina.com.cn/s/blog_4b44e1c001000avp.html
這篇講的還算簡單明瞭吧。