虚函数
一、关键点
虚函数:某些成员函数,基类希望它的派生类各自定义适合自身的版本
任何构造函数之外的非static函数都可以是虚函数
关键字virtual只能出现在类内部的声明语句之前而不能用于类外部的函数定义
- 一旦某个函数被声明成虚函数,则在所有派生类中它都是虚函数
- 派生类必须在其内部对所有重新定义的虚函数进行声明
- 一个派生类的虚函数如果覆盖了对应基类的虚函数,则它的形参类型必须与被它覆盖的基类函数完全一致;同样,派生类中虚函数的返回类型也必须与基类函数匹配,但该规则有个例外
- 派生类如果定义了一个函数与基类中虚函数的名字相同但是形参列表不同,这是合法的,但没有覆盖掉基类中的版本,编译器将认为这个函数与基类中的虚函数是相互独立的
- C++11新标准允许派生类显式地注明其重新定义的虚函数,在形参列表后增加关键字override;如果使用override标记了某个函数,而该函数并没有覆盖已存在的虚函数,此时编译器将报错
- 我们使用override想表达的意思是,我们希望派生类重新定义的虚函数能覆盖基类中的虚函数,切记只有虚函数能被覆盖
- 把虚函数指定为final,表示不允许后续的其他类覆盖该虚函数
二、虚函数与动态绑定的关系
使用基类的引用或指针调用一个虚成员函数时会执行动态绑定,而通过其他表达式调用虚函数则在编译时就会将调用的版本确定
动态绑定只有当我们通过指针或引用调用虚函数时才会发生
如果虚函数使用了默认实参,那么动态绑定会失效,实参值由调用的静态类型决定
超链接:
例外:当类的虚函数返回类型是类本身的指针或引用时,派生类的返回类型可与基类不同,前提是从派生类到基类的类型转换时可访问的
这个函数:我会深究如果只定义了它但没有重新定义虚函数会发生啥?只要它不用override声明就不会报错,该类中的此虚函数版本同基类版本。实际上,我们自己操作不会定义这么一个傻缺函数。