您的位置:首页 > 汽车 > 时评 > 重庆市工程招标信息网_山东省政府办公厅马希军_比较好的网络优化公司_大数据营销案例分析

重庆市工程招标信息网_山东省政府办公厅马希军_比较好的网络优化公司_大数据营销案例分析

2025/4/24 15:09:18 来源:https://blog.csdn.net/su1326669003/article/details/144327390  浏览:    关键词:重庆市工程招标信息网_山东省政府办公厅马希军_比较好的网络优化公司_大数据营销案例分析
重庆市工程招标信息网_山东省政府办公厅马希军_比较好的网络优化公司_大数据营销案例分析

多态

  • 概念
  • 虚函数
    • 使用方法 【虚函数的重写】
      • 虚函数重写
      • 特殊的使用方法(少用)
      • 调用不同类的函数时,this指针永远指向该类的对象地址
      • 重写时,只重写了“实现”,“外壳”没有被重写
    • 有虚函数的对象模型
    • 为何使用基类的父类指针或引用来调用虚函数
  • 虚函数表
    • 验证虚函数表的存放位置【重在思想】
    • 对象中有多个虚函数表指针,重写后的函数该放何处
      • 放在第一个虚表里的两大原因
  • [C++11]C++11中,两种新的语法
    • 如何设计不想被继承的类
      • 构造函数私有化
      • 基类加上final
  • 早期绑定与晚期绑定
  • 析构函数为何是虚函数
  • 总结重载、重写与重定义

概念

  • 用对象调用同一函数时,会根据不同对象调用不同的函数
  • 也就是说,如果出现了
A a;
A b = new B;
A c = new C;a.func();
b.func();
c.func();

的情况,那么每个对象都能调用到其对于的函数

  • 就如同网上抽奖一样,明明都是用户进行抽奖这个操作,却因为新用户和老用户的不同,抽奖的倍率也会有所不同(

虚函数

  • 虚函数的作用就是实现上述的功能,不过虚函数只是一个函数的状态,具体要实现多态还得往下看

使用方法 【虚函数的重写】

  1. 使用基类的指针或引用去调用
  2. 调用的是重写后的虚函数
  • 虚函数的定义: virtual void Func()

虚函数重写

  • 重写是指返回值、函数名和参数类型都相同,但是实现的内容不同

特殊的使用方法(少用)

  1. 子类的虚函数重写可以不带上virtual【但是推荐加上,养成良好的代码习惯】
  2. 协变:重写虚函数的返回值可以不同,但是要求返回值是父子关系的指针/引用(即使与当前继承体系无关的另一套继承体系也可以)

调用不同类的函数时,this指针永远指向该类的对象地址

  • 继续往下看

重写时,只重写了“实现”,“外壳”没有被重写

直接贴例题,加强记忆理解

有虚函数的对象模型

  • 第一个位置存放的是:指向虚函数表的指针
  • 剩下的位置放成员数据

为何使用基类的父类指针或引用来调用虚函数

  1. 用父类指针的原因

只有父类指针,才能既指向子类又指向父类

  1. 不用父类对象的原因

因为不会拷贝虚表,所以不使用

那么,如果拷贝了虚表呢?


(以下情况都是普通对象会拷贝虚表的情况,实际当中并不会,只是为了理解更加深刻所作的说明)
如果拷贝了虚表,那么会出现怎么调用都是调用子类的情况:

Person ps;
Student st;ps = st;

这个时候的ps的虚表被拷贝成了st的,如果后续有指针使用ps的虚函数,那只会使用st指向的虚表,无法获得ps的虚表

虚函数表

  • 虚函数表就是存放虚函数的表,是一个函数指针数组

验证虚函数表的存放位置【重在思想】

对象中有多个虚函数表指针,重写后的函数该放何处

  • 重写后的函数放在了第一个虚表里

放在第一个虚表里的两大原因

[C++11]C++11中,两种新的语法

如何设计不想被继承的类

构造函数私有化

  • 将构造函数私有化,这样子类就无法继承父类的构造函数,由于子类构造时要先调用父类的构造函数,而父类的构造函数又被隐藏了起来,因此无法继承
  • 这种情况下入药要正常使用父类的话,可以用一个public的函数去构造父类对象

基类加上final

使用方式virtual void Func() final

早期绑定与晚期绑定

  1. 早期绑定又称动态绑定(运行时),一般指虚函数重写
  2. 晚期绑定又称静态绑定(编译时),一般指函数重载

析构函数为何是虚函数


总结重载、重写与重定义

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com