对象切割 - 常量引用传递
2015-06-21 10:35
239 查看
看一个简单的例子:
在调用fun函数时,会有形参的拷贝,会调用Base的构造函数,由于name、hobby和title都是string对象,所以会有构造。也就是4次构造,对应的有4次析构,消耗很大,通过引用传递可以有效地避免
对象切割
当把一个派生类的对象赋给一个基类的对象时,会发生对象切割(基类对象强制转换派生类对象也会发生)
例如
运行结果为:
可以看出,指针和地址传递可以实现虚函数的多态功能,在fun1(Base b)中, 传递Derived对象时发生了对象的切割,而对象的切割不会发生多态,所以调用Base当中对应的函数。
总结:多态的实现是通过指针和引用;而对象的转换只会造成对象切割,不能实现多态
#include <iostream> using namespace std; class Base { private: string name; string hobby; string title; }; void fun(Base a) { } int main() { Base a; fun(a); return 0; }
在调用fun函数时,会有形参的拷贝,会调用Base的构造函数,由于name、hobby和title都是string对象,所以会有构造。也就是4次构造,对应的有4次析构,消耗很大,通过引用传递可以有效地避免
#include <iostream> using namespace std; class Base { private: string name; string hobby; string title; }; void fun(Base &a) //引用,不会有临时对象拷贝 { } int main() { Base a; fun(a); return 0; }
对象切割
当把一个派生类的对象赋给一个基类的对象时,会发生对象切割(基类对象强制转换派生类对象也会发生)
例如
class Base { public: virtual void fun() { cout << "Base fun() is Called." << endl; } }; class Derived:public Base { public: void fun() { cout << "Derived fun() is called." << endl; } }; void fun1(Base b) { b.fun(); } void fun2(Base *b) { b->fun(); } void fun3(Base &b) { b.fun(); } int main() { Derived d; fun1(d); fun2(&d); fun3(d); system("pause"); return 0; }
运行结果为:
可以看出,指针和地址传递可以实现虚函数的多态功能,在fun1(Base b)中, 传递Derived对象时发生了对象的切割,而对象的切割不会发生多态,所以调用Base当中对应的函数。
总结:多态的实现是通过指针和引用;而对象的转换只会造成对象切割,不能实现多态
相关文章推荐
- 餐饮美食图片数据表
- StrongReference, SoftReference, WeakReference 图解说明
- hdu 5272
- 本地推送UILocalNotification
- 【读书笔记:C++ primer plus 第六版 中文版】第2章:开始学习C++
- Android在ExpandableListView控制的基本使用
- 反射取子类、父类 属性
- 单例设计模式的两种实现
- 使用CTex完成北京科技大学本科生毕业设计
- ASP.NET MVC 部署全站HTTPS
- Struts2(五)自定义拦截器
- 第十六周【项目1-平方根中的异常】
- The Derivation About CNN and Antoencoder
- 测试与调试
- 第十六周项目三 max带来的冲突
- proxy-target-class 作用
- 【日常学习】【棋盘DP】codevs1267 老鼠的旅行题解
- 你的初创企业究竟应该用哪种开源协议?
- Linux用户操作(在实验楼的学习记录)
- 《人,绩效和职业道德》及博客读后感