虛(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、虛類的對象最前面都是一個虛表指針,指向類的虛表。

