找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 901|回复: 0

[分享] 来了解了解c++中的多态

[复制链接]

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-5-20 22:10:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
c++中的多态其实不是很神秘, 照着思想实现起来也不是很难
1. 现在看看什么是多态? (what?)
    多态就是同一个语句在同一个类族中穿梭时说表现不同的结果
2. 多态成立的三要素
   (1) 有继承
   (2) 有虚函数重写
   (3) 父类指针或引用指向子类对象
3. 多态的实现
   c++中的多态通过就是使用的C语言中的回调函数实现
   类中的方法存在 virtual 关键字的函数被称为虚函数, 只要存在虚函数的情况下, 不论是否产生多态都会创建出一个vptr 指针, 也就是虚函数表指针

   这个指针指向虚函数表, 而表中存放的是被virtual修饰的函数的函数指针,

   当我们在 new 子类并将这块内存空间的地址给基类的时候
   这时c++编译器会去调用 子类的构造函数并在'{' 花括号时(也就是作用域开始时), 调用父类的构造函数, 然后返回子类的构造函数,
在这个过程中
   编译器会先产生 this 指针, 然后通过判断是否存在 virtual修饰的函数创建一个 vptr 虚函数指针, 此时程序运行到了子类的构造函数作用域开始前
   这时编译器会先去调用基类的构造函数, 而vptr 指针会在基类的构造函数执行时被赋值给基类产生的虚函数表, 直到程序从父类构造函数中回到
   子类的构造函数时, vptr 指针会被再次赋值给子类的虚函数表, 这就是两次赋值的情况, 在这个过程中产生了两个虚函数表, 但是只有一个虚函数指针
   指向了子类的虚函数表中, 或者说产生了一个虚函数表, 而子类的 vptr 指针指向的是这个表的中间位置, 也就是子类的虚函数指针开始的位置处

总结下来就是:
(1) 虚函数表存在两两个一个父类的一个子类的, 但是对象只有一个, 所以这两个虚函数表估计和成一个
(2) 虚函数指针被赋值初始化了两次, 一次在父类构造函数时, 一个在子类构造函数时
(3) 不论是否产生多态, 只要有virtual修饰函数都存在vptr 指针和虚函数表
(4) 多态产生的三要素
   
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 20:28 , Processed in 0.318863 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表