博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对象切割 - 常量引用传递
阅读量:4223 次
发布时间:2019-05-26

本文共 1049 字,大约阅读时间需要 3 分钟。

看一个简单的例子:

#include 
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 
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当中对应的函数。

总结:多态的实现是通过指针和引用;而对象的转换只会造成对象切割,不能实现多态

你可能感兴趣的文章
推荐 | 最有趣的机器学习可视化图集
查看>>
摩尔定律行将就木?AI灵丹助其返老还童!(附论文)
查看>>
送你9个常用的人脸数据库(附链接、报告)
查看>>
人脸识别三大经典算法(附PDF下载、经典论文列表)
查看>>
智慧健康,协同发展:清华大学携手天津市共同探索健康医疗大数据
查看>>
计算机科学专业毕业?这是给你的职业建议(亮点在最后)
查看>>
怎样判断漂亮女孩是不是单身的?
查看>>
独家 | 教你使用Keras on Google Colab(免费GPU)微调深度神经网络
查看>>
独家 | 如何利用大规模无监督数据建立高水平特征?
查看>>
福利 | NVIDIA英伟达免费直播课:带你选择、搭建AI服务器!
查看>>
报名 | 清华园里的AI公开课!第三讲之神经网络
查看>>
教你在Python中构建物体检测系统(附代码、学习资料)
查看>>
报名 | Sven Travis教授设计与人工智能思享会
查看>>
报名 | 瓜子二手车周洲:如何玩转AI赋能下的新零售?
查看>>
经典论文复现 | LSGAN:最小二乘生成对抗网络
查看>>
报名 | 第二届网上行为社会网分析学术研讨会
查看>>
独家 | 用Python Featuretools库实现自动化特征工程(附链接)
查看>>
报名 | 二值化网络 & 基于素描图的图像检索论坛
查看>>
干货 | 清华大学郑方:语音技术用于身份认证的理论与实践
查看>>
近期活动盘点:2018数据与媒介发展论坛、大数据应用中日交流论坛(11.04-11.15)...
查看>>