吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2600|回复: 2
收起左侧

[C&C++ 转载] [c++]来了解了解c++中的多态

[复制链接]
小可爱~ 发表于 2017-5-13 02:03
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) 多态产生的三要素
   
如果有说错的话, 还请批评赐教, 最近在学 JAVA 面向底层的东西比较少, 一些知识点再不复习下, 怕忘记了
   

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

sdaza 发表于 2017-5-13 06:33 来自手机
感谢分享。
ayaoko 发表于 2017-5-13 08:54
本帖最后由 ayaoko 于 2017-5-13 08:58 编辑

刚刚好在学习这个虚函数,谢谢楼主分享学习了。
也找到陈皓老师讲的虚函数表,内容很好也一起分享一下。
陈皓:C++ 虚函数表解析
http://blog.csdn.net/haoel/article/details/1948051/
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-14 03:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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