https://www.jb51.cc/csharp/1193391.html

编程之家收集整理的这篇文章主要介绍了C++11新特性 - 多态和虚函数,override说明符编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

多态和虚函数

多态是C++的重要特征之一,同时也是初学者比较难理解的特征。先来看一个简单的例子:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/44cc0fd6-b1dd-4206-9474-af34aabff3fb/8422e3f26e922112be7b619b1e8a6163.png

代码很简单,按照作者自己的话描述一下上述代码中多态从定义到起作用的要点,应该不会再简单了,从main函数看起:

  1. 基类的指针
  2. 指向派生类的对象
  3. 派生类覆盖了基类中定义的虚函数

这三点是必要条件,缺一不可。

上面的代码还有另外一些有有意思的地方,虽然不影响结果,但还是了解一下为好。派生类中重新定义(覆盖)基类中虚函数时:

  1. virtual关键词不是必须
  2. 不必将函数声明为public

覆盖失败的情况

函数的覆盖要求两个函数的签名必须一致。例如下面的代码:

https://pic.jb51.cc/2022/01-13/12/b9fa0a6d615fcf78c274f140d4236d93.png

由于sub2::f1的签名和base::f1的签名不一致,所以无法实现多态。

也许你会觉得这个错误太明显了,根本不会发生。那是因为本例中的成员函数太简单了。在实际的开发中随着开发规模的扩大,类的继承关系会变得越来越深,成员函数的参数也会越来越多,经常会遇到派生类中定义的成员函数的签名和覆盖对象的签名不一致的而导致覆盖失败的情况。

而且要命的是,这种错误不会产生编译错误,不容易被发现。