多态,不同数据类型(父子类)用同一个接口
虚函数的优势在于当用指针调用虚函数的时候,即使是基类类型的指针,也会调用到派生类型的函数。
示例
父类使用虚函数后,子类继承时实现动态绑定
有了虚函数我们就能通过基类的的指针进行动态绑定,在运行时访问到子类的函数,但是动态绑定只能发生在指针或引用上。
动态绑定
当编译器在编译过程中遇到virtual关键字时,它不会对函数调用进行绑定,而是为包含虚函数的类建立一张虚函数表Vtable。在虚函数表中,编译器按照虚函数的声明顺序依次保存虚函数地址。同时,编译器会在类中添加一个隐藏的虚函数指针VPTR,指向虚函数表。在创建对象时,将虚函数指针VPTR放置在对象的起始位置,为其分配空间,并调用构造函数将其初始化为虚函数表地址。需要注意的是,虚函数表不占用对象空间。
1、单继承下的虚函数表
虚函数表中的指针顺序,按照虚函数声明的顺序排序;基类的虚函数指针在派生类的前面。
2、多继承下的虚函数表
多继承关系下会有多个虚函数表,也会有多个指向不同虚函数表的指针;