虚函数
2016-08-09 15:33
225 查看
C++支持编译时多态和运行时多态,运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。
只有当基类指针指向子类对象时,才显现多态性,根据指针指向的不同,调用不同对象的虚函数。
虚函数与重载函数的区别:
1)重载函数之间必须在参数的类型或者数量上加以区分,而重新定义的虚函数在参数的类型和数量上必须与原型相同;
2)在定义虚函数的类中,虚函数必须声明为类的成员而不能是友元,可以被声明为其他类的友元;析构函数可以是虚函数,构造函数不行。
[b]析构函数为什么是虚函数:[/b]
(基类的析构函数不是虚函数,在main函数中用继承类的指针去操作继承类的成员,释放指针P的过程是:先释放继承类的资源,再释放基类资源. )
用基类的指针去操作继承类的成员,释放指针P的时候:只是释放了基类的资源,而没有调用继承类的析构函数.造成内存泄漏
纯虚函数及其作用:
纯虚函数是指在基类中声明但是没有定义的虚函数:virtual type func(param list) = 0;
把虚函数声明为纯虚函数可以强制在派生类中重新定义虚函数,否则编译器会报错。
如果不需要基类对派生类及对象进行操作,则不能定义虚函数,因为这样会增加内存开销.当类里面有定义虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间.所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数.
只有当基类指针指向子类对象时,才显现多态性,根据指针指向的不同,调用不同对象的虚函数。
虚函数与重载函数的区别:
1)重载函数之间必须在参数的类型或者数量上加以区分,而重新定义的虚函数在参数的类型和数量上必须与原型相同;
2)在定义虚函数的类中,虚函数必须声明为类的成员而不能是友元,可以被声明为其他类的友元;析构函数可以是虚函数,构造函数不行。
[b]析构函数为什么是虚函数:[/b]
(基类的析构函数不是虚函数,在main函数中用继承类的指针去操作继承类的成员,释放指针P的过程是:先释放继承类的资源,再释放基类资源. )
用基类的指针去操作继承类的成员,释放指针P的时候:只是释放了基类的资源,而没有调用继承类的析构函数.造成内存泄漏
纯虚函数及其作用:
纯虚函数是指在基类中声明但是没有定义的虚函数:virtual type func(param list) = 0;
把虚函数声明为纯虚函数可以强制在派生类中重新定义虚函数,否则编译器会报错。
如果不需要基类对派生类及对象进行操作,则不能定义虚函数,因为这样会增加内存开销.当类里面有定义虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间.所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数.
相关文章推荐
- Gulp配合Webpack的时候,如何让Webpack生成生产环境代码
- Android 全屏显示方案
- ElasticSearch第1课之基本介绍
- OpenCV+ Python
- Eclipse中启动Tomcat后,http://localhost:8080/无法访问
- Android硬件H264保存文件
- 根据Matrix获取Rotation
- 基于zookeeper的分布式锁实现
- 安卓推送——个推服务端api使用误区
- 几种常见的博弈
- centos7 内核参数优化
- 什么是重定向
- DataGridView中CellFormatting事件的应用
- Xcode 7 设置 LaunchImage图片
- POJ 3020 Antenna Placement
- 【Algothrim】 动态规划实例 (Bone Collector)
- mybatis实战教程(mybatis in action),mybatis入门到精通
- IOI集训论文集
- 自然语言处理︱简述四大类文本分析中的“词向量”(文本词特征提取)
- Ehcache——设置缓存的大小