基类指针和子类指针之间相互赋值
(1)将子类指针赋值给基类指针时,不需要进行强制类型转换,C++编译器将自动进行类型转换。因为子类对象也是一个基类对象。

(2)将基类指针赋值给子类指针时,需要进行强制类型转换,C++编译器将不自动进行类型转换。因为基类对象不是一个子类对象。子类对象的自增部分是基类不具有的。(强制转换告诉编译器为对象增加子类所特有的部分)

fish* fh1;  animal* an1 = new animal; fh1 = (fish*)an1;

原理:

当我们构造fish类的对象时,首先要调用animal类的构造函数去构造animal类的构造函数,然后才调用fish类的构造函数完 成自身部分的构造,从而拼接出一个完整的fish对象。

fish对象在内存中的存储

Animal对象的内存

Fish继承部分

当我们将fish类对象转换为animal类对象时,该对象就被认为是原对象整个内存模型的上半部 分,也就是图中animal对象的内存部分。当我们利用类型转换后的对象指针去调用它的方法时,自然是调用它所在的内存中的方法。

多态

多态与非多态的实质区别就是函数地址是早绑定还是晚绑定(多态)。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。

最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。

代码形式                                   对于虚函数                                                    对于非虚函数

作用                                  绑定方式                   作用                     绑定方式
类名::函数()        调用指定类的指定函数                 静态绑定     调用指定类的指定函数            静态绑定 
对象名.函数()      调用指定对象的指定函数              静态绑定     调用指定对象的指定函数          静态绑定 
引用变量.函数()   调用被引用对象所属类的指定函数  动态绑定    调用引用变量所属类的指定函数 静态绑定 
指针->函数()      调用被引用对象所属类的指定函数    动态绑定   调用指针变量所属类的指定函数   静态绑定

从上表可以看出,执行动态绑定的只有通过地址,即只有通过指针或引用变量才能实现,而且还必须是虚函数。从概念上来说,虚函数机制只有在应用于地址时才有效,因为地址在编译阶段提供的类型信息不完全。

最新文章

  1. 【饿了么】招聘Java开发工程师、架构师
  2. gradle << 操作符作废
  3. 1019mysql 复制技术
  4. #Deep Learning回顾#之基于深度学习的目标检测(阅读小结)
  5. Css:背景色透明,内容不透明之终极方法!兼容所有浏览器
  6. JS代码片段:appendHTML 和 insertAdjacentHTML
  7. codeforces Gym 100500H H. ICPC Quest 水题
  8. (七)学习CSS之filter属性
  9. Linux中.a,.la,.o,.so文件的意义和编程实现
  10. Responsive Design响应式网站设计心得笔记
  11. 仿简书分享:UIActivityViewController系统原生分享
  12. signalr中Group 分组群发消息的简单使用
  13. nodejs 简单安装环境
  14. 《.NET 进阶指南》读书笔记1------NET程序集与普通EXE文件的区别
  15. Redis结合Lua脚本实现高并发原子性操作
  16. vue修改框架样式/deep/
  17. java_manual的一点体会
  18. Phone List HDU - 1671 字典树
  19. Windows下好用的git客户端--GitExtentions
  20. Fantacy团队周二站立会议

热门文章

  1. java基础第10天
  2. SqlServer缓存依赖 示例
  3. CS231n课程笔记翻译8:神经网络笔记 part3
  4. ZetCode PyQt4 tutorial Dialogs
  5. SqlServer一些常用函数(持续更新。。。)
  6. Struts2自定义标签4自定义分页标签
  7. vue+webpack多个项目共用组件动态打包单个项目
  8. graphql-binding openapi 集成demo
  9. clamav完整查杀linux病毒实战(转)
  10. Asp.net MVC Comet 推送