- UID
- 5043
- 积分
- 1347
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-5-13
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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) 多态产生的三要素
|
|