什么是? 有virtual关键字的成员函数就是虚函数
为什么? 实现多态,通过指向基类的指针或引用可以访问子类中同名覆盖成员函数
如果没有定义为虚函数呢? 基类指针即使指向了子类对象(已重写该函数),调用函数仍为基类函数
所有的函数都可以定义成虚函数么?非类的成员函数(如 友元函数),类的静态成员函数、构造函数,不可以
什么时候必须定位虚函数呢?你需要多态时,注意,有动态分配内存的时候,析构函数必须是虚函数。
子类覆盖函数没有virtual关键字还是虚函数么? 是
纯虚函数是什么? 相当于一个接口定义,没有具体实现,函数原型后加“=0”
子类可以不覆盖虚函数吗? 可以
子类可以不覆盖纯虚函数吗?不可以
含有纯虚函数的类可以实例化吗?不可以,只要有一个,该类就不能实例化,即为抽象类
虚函数的实现问题 - 虚函数表
C++的编译器应该是保证虚函数表的指针存在于对象实例中最前面的位置
具体的,如果只有一个基类,基类的虚函数在子类的虚函数前面,如果有多个基类
每一个都有自己的虚函数列表,子类的新定义虚函数在第一个基类虚表中
如果基类的虚函数已被子类覆盖,则基类的虚函数位置存储子类的覆盖函数地址