多态、虚函数、虚函数指针、虚函数表

多态:当函数声明为虚函数时,使用父类对象引用子类对象时,会调用子类中的函数,通过这种方法,还能够同时访问子类成员变量

  • 函数所有的申明一定要相同
  • 在重定义虚函数的情况下,在派生类中如果想要调用父类中的函数,可以使用

父类域名解析符::函数名 来调用父类函数

多态使用场景

如果定义了一个英雄父类,所有的人物都继承这个父类,那么,在写代码时,使用父类的指针就可以调用这些继承类的所有重定义函数

多态的对象模型

  • 成员函数是静态的,不会存放在对象内存模型中,使用时,将this指针传给成员函数即可
  • 有无虚函数对象内存模型对比,多了一个虚函数表指针
    • image.png
    • 虚函数使用类名::虚函数名来表示
    • 如果有没有虚函数时,编译时,会将成员函数地址直接链接到二进制文件中,如果有虚函数,则不会
  • 如果调用普通成员函数,则直接传地址给成员函数。如果调用虚函数,则先查表,再调用
  • 如果派生类重定义了虚函数,则会替代虚函数中的那一项,如图
    • image.png
  • 如果没有重定义,则不会替代,调用的还是父类虚函数
  • 如果子类自己重新定义一个虚函数,则会在虚函数表中追加一项
  • 辅助理解的两张图

image.png
image.png

实现多态时,需要将父类的析构函数也设置问虚函数,以方便后续对其析构
父类内存模型
image.png
子类内存模型
image.png
定义为虚析构函数后,会将析构函数名改为{dtor}存入虚函数表中
(调用子类析构函数时,一定会调用一次父类析构函数)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值