C++基础——多态

多态

  1. 是什么?几个相似但不相同的对象对同一个消息的反应不同,如鼠标点击,有的打开文档有的打开应用,点击画图时,同样是点击但有的是圆有的是方形。C++中的多态是指,由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应

  2. 好处?增加程序的灵活性,减轻系统升级维护调试的工作量和复杂的

  3. 赋值兼容:使用公有派生类的对象来替代基类对象,是一种默认的,不需要显示转化

    //赋值兼容,s的基类对象,c是子类对象
    s = c; //子类的对象赋值给基类的对象
    Shape &sp = c;//子类的对象初始化基类的引用
    Shape *ps = &c;//子类对象的地址可以赋值给指向基类的指针
    
    c = s //错误的,赋值不兼容
    

    替换后派生类对象可以作为基类的对象使用,但只能使用从基类继承的成员

  4. 多态形成的条件

    1. 父类中有虚函数
    2. 子类覆写(override)父类中的虚函数,覆写的函数也是虚函数
      • 覆写的条件:同父类完全相同,最好在前面加上virtual,不加也可以
      • 为什么要override? 要实实现接口的具体化
    3. 通过已被子类对象赋值的父类指针,调用共用接口
  5. 静多态和动多态

    • 静多态:函数重载 func()、func(int a) 在编译阶段就决定了调用情况

    • 动多态:在运行时发生,事先指向谁不知道

      eg:指针点击不同的图形画线时:公共接口就是draw,点击的时候拿到父类的指针,指针被直线赋了值,画出来的就是直线,点击曲线时被曲线赋值,画出来的就是曲线,下一个要点击的是事情不知道的,点到什么画什么,这就是动多态。

  6. 虚函数

    • 目的:提供公共的接口,统一对外的接口,诞生虚函数的目的就是实现多态
    • 语法:virtual 函数声明 (类外实现的时候不用加virtual)
    • 扩展:virtual static friend (声明需要实现不用) const(声明实现都需要加)
    • 纯虚函数
      • 纯虚函数的声明 : virtual 函数声明 = 0;
      • 没有实现体
      • 含有纯虚函数的类,叫抽象基类 abstract class,不能实例化,仅仅为了提供族类的接口
      • 如果子类没有覆写纯虚函数,那子类也为抽象基类,不能实例化(子类要么不拿下来,拿下来就要覆写,就不是纯虚的)
      • 凡是含有虚函数的类,其析构也要虚一下,可以实现完整的析构。(在堆上时)delete 父类的指针时要实现同时调用父子类的析构
  7. 基于多态的设计模式——依赖倒置

    定义:高层模块不应该依赖于底层模块,二者都应依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象

    开闭原则 :闭是指高层业务的接口高度抽象,不要试图去修改,如果有新的功能增加的话通过类来实现

    依赖倒置:

  8. 多态浅析:

  • 多态是通过虚函数表实现的,这个表主要是类的虚函数地址表,能解决继承和覆盖的问题。虚函数在对象实例的最前面,分配在内存中。比较绕人
  • 简单的来说就是在对象实例的内存最前面有张表,父类有虚函数时函数地址会存在表里,如果子类也有虚函数但没覆写父类的,则在表后继续增加,如果子类覆写了父类的虚函数,则新的函数就代替了原来父类的虚函数在表中的位置。需要找某个函数时:首先知道对象的地址,然后从地址的内容中找到虚函数表,在虚函数表从第一个地址中加或减就能找到对应的函数,这样就能拥有一个相对的关系,事先编译的时候这个相对关系就可知道,但对象的地址需要等待运行的时候才能知道,只要一直到对象的地址,就能立刻找到像要调用的函数
  • 多态实现了动态的绑定,牺牲了些许的空间和效率(有些在编译阶段决定不了需要在运行中才能决定)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值