虛(virtual)函數是為了實現多態,派生類可以覆寫(override)基類的虛函數。
1、多態(polymorphism),即基類指針或者引用,可能指向基類對象,也可能指向派生類對象,會根據運行時具體指向的對象,來調用不同的函數。
2、如果沒有多態,則什么類型的指針或者引用,就會調用什么類型的對象的函數。
class Animal { public: // 編譯時靜態綁定 void print1() { printf("print1 parent class.\n"); } // 虛函數,告訴編譯器,運行時動態綁定。 virtual void print2() { printf("print2 parent class.\n"); } virtual void print3() { printf("print3 parent class.\n"); } }; class Dog: public Animal { public: void print1() { printf("print1 Dog class.\n"); } void print2() { printf("print2 Dog class.\n"); } }; Animal *pAni; Dog dog; pAni = &dog; pAni->print1(); pAni->print2(); pAni->print3(); 輸出: print1 parent class. print2 Dog class. print3 parent class.
3、每個包含虛函數的類(也叫虛類),都有一個虛函數表(簡稱虛表),表項是一個虛函數的地址。
4、如果基類是虛類,則繼承類也是虛類。
5、虛類的對象最前面都是一個虛表指針,指向類的虛表。