多态和虚函数

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

1.png

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

  1. 基类的指针

  2. 指向派生类的对象

  3. 派生类覆盖了基类中定义的虚函数

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

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

  1. virtual关键词不是必须

  2. 不必将函数声明为public

覆盖失败的情况

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

1.png

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

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

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

override说明符

为了解决这个问题,C++11中引入了一个方法:在声明、定义派生类中的覆盖函数时使用override说明符:

1.png

由于明确的函数的用意,所以当编译器无法在基类中找到相同签名的虚函数的时候,就会产生编译错误。

作者感受

更好运用语言本身的功能,不放弃任何自动查出错误的机会,这应该成为C++程序员的习惯。也算是工匠精神的体现吧。

相关文章:

详谈c++11 final与override说明符

C++11新特性中auto 和 decltype 区别和联系

相关视频:

Android6.0新特性

更多相关文章

  1. 探索C++虚函数在g++中的实现(动多态)_虚函数表剖析
  2. 第一章C++:函数返回值、GNU编译器命令
  3. 第六章C++:函数基础与应用
  4. C++异常处理:系统函数terminate的调用
  5. C++学习基础知识--this指针、静态成员、常量成员函数
  6. 深度解析C++的函数模板与类模板
  7. C++类的静态数据成员和静态成员函数
  8. C#中复制构造函数是什么
  9. c语言函数调用的三种方式是什么

随机推荐

  1. 我是这么自学Java的
  2. 腐朽王朝的更迭:谈 SM 系统的技术升级和持
  3. 报表工具,买?自研?
  4. 讲给前端的正则表达式(3):使用 ES6 特性[
  5. 生活中,那至美
  6. 从模版方法模式到 SPI 演变 :好的思想通用
  7. 为什么你的提问总得不到想要的答案?
  8. 松一松身上的"螺丝",可以更舒坦
  9. 25K的996 和 18K的965,你选哪个?
  10. 一文讲透微服务下如何保证事务的一致性