虚(virtual)函数是为了实现多态,派生类可以覆写(override)基类的虚函数。
1、多态(polymorphism),即基类指针或者引用,可能指向基类对象,也可能指向派生类对象,会根据运行时具体指向的对象,来调用不同的函数。
2、如果没有多态,则什么类型的指针或者引用,就会调用什么类型的对象的函数。
class Animal { public: // 编译时静态绑定 void print1() { printf("print1 parent class. "); } // 虚函数,告诉编译器,运行时动态绑定。 virtual void print2() { printf("print2 parent class. "); } virtual void print3() { printf("print3 parent class. "); } }; class Dog: public Animal { public: void print1() { printf("print1 Dog class. "); } void print2() { printf("print2 Dog class. "); } }; Animal *pAni; Dog dog; pAni = &dog; pAni->print1(); pAni->print2(); pAni->print3(); 输出: print1 parent class. print2 Dog class. print3 parent class.
3、每个包含虚函数的类(也叫虚类),都有一个虚函数表(简称虚表),表项是一个虚函数的地址。
4、如果基类是虚类,则继承类也是虚类。
5、虚类的对象最前面都是一个虚表指针,指向类的虚表。