C++ 基类指针,子类指针,多态
2015-09-22 06:24
549 查看
基类指针和子类指针之间相互赋值
(1)将子类指针赋值给基类指针时,不需要进行强制类型转换,C++编译器将自动进行类型转换。因为子类对象也是一个基类对象。
(2)将基类指针赋值给子类指针时,需要进行强制类型转换,C++编译器将不自动进行类型转换。因为基类对象不是一个子类对象。子类对象的自增部分是基类不具有的。(强制转换告诉编译器为对象增加子类所特有的部分)
fish* fh1; animal* an1 = new animal; fh1 = (fish*)an1;
原理:
当我们构造fish类的对象时,首先要调用animal类的构造函数去构造animal类的构造函数,然后才调用fish类的构造函数完 成自身部分的构造,从而拼接出一个完整的fish对象。
fish对象在内存中的存储
当我们将fish类对象转换为animal类对象时,该对象就被认为是原对象整个内存模型的上半部 分,也就是图中animal对象的内存部分。当我们利用类型转换后的对象指针去调用它的方法时,自然是调用它所在的内存中的方法。
多态
多态与非多态的实质区别就是函数地址是早绑定还是晚绑定(多态)。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。
最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。
代码形式 对于虚函数 对于非虚函数
作用 绑定方式 作用 绑定方式
类名::函数() 调用指定类的指定函数 静态绑定 调用指定类的指定函数 静态绑定
对象名.函数() 调用指定对象的指定函数 静态绑定 调用指定对象的指定函数 静态绑定
引用变量.函数() 调用被引用对象所属类的指定函数 动态绑定 调用引用变量所属类的指定函数 静态绑定
指针->函数() 调用被引用对象所属类的指定函数 动态绑定 调用指针变量所属类的指定函数 静态绑定
从上表可以看出,执行动态绑定的只有通过地址,即只有通过指针或引用变量才能实现,而且还必须是虚函数。从概念上来说,虚函数机制只有在应用于地址时才有效,因为地址在编译阶段提供的类型信息不完全。
(1)将子类指针赋值给基类指针时,不需要进行强制类型转换,C++编译器将自动进行类型转换。因为子类对象也是一个基类对象。
(2)将基类指针赋值给子类指针时,需要进行强制类型转换,C++编译器将不自动进行类型转换。因为基类对象不是一个子类对象。子类对象的自增部分是基类不具有的。(强制转换告诉编译器为对象增加子类所特有的部分)
fish* fh1; animal* an1 = new animal; fh1 = (fish*)an1;
原理:
当我们构造fish类的对象时,首先要调用animal类的构造函数去构造animal类的构造函数,然后才调用fish类的构造函数完 成自身部分的构造,从而拼接出一个完整的fish对象。
fish对象在内存中的存储
Animal对象的内存 |
Fish继承部分 |
多态
多态与非多态的实质区别就是函数地址是早绑定还是晚绑定(多态)。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。
最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。
代码形式 对于虚函数 对于非虚函数
作用 绑定方式 作用 绑定方式
类名::函数() 调用指定类的指定函数 静态绑定 调用指定类的指定函数 静态绑定
对象名.函数() 调用指定对象的指定函数 静态绑定 调用指定对象的指定函数 静态绑定
引用变量.函数() 调用被引用对象所属类的指定函数 动态绑定 调用引用变量所属类的指定函数 静态绑定
指针->函数() 调用被引用对象所属类的指定函数 动态绑定 调用指针变量所属类的指定函数 静态绑定
从上表可以看出,执行动态绑定的只有通过地址,即只有通过指针或引用变量才能实现,而且还必须是虚函数。从概念上来说,虚函数机制只有在应用于地址时才有效,因为地址在编译阶段提供的类型信息不完全。
相关文章推荐
- C++类的构造函数和析构函数
- Windows下编译C语言文件
- IOS开发基础之C语言程序实现迷宫游戏,分享给大家,欢迎讨论
- C和指针(学习之旅)
- c++课程后的感想与记录
- 用C和C++编写输出乘法口诀表
- c++的boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)详解
- More Effective C++ 条款14 明智运用exception specifications
- c/c++ sort函数的用法
- c++ primer第五版(中文)习题答案 第十章第二节第三小节-重排容器元素的算法
- C语言程序初体验-第四课-第四题:圆柱体的表面积
- C++ 单链表快速排序
- c++设计模式-----代理模式proxy
- C语言程序初体验-第四课-第三题:温度转换
- C语言程序初体验-第四课-第二题:计算并联电阻R的阻值
- c++ const学习
- 超简单的c语言程序
- 关于C++中的类型转换操作符
- 项目23.6 前导0的数字
- Effective c++笔记:03 尽可能使用const