对象切片

当多态的处理对象时,传地址与传值有明显不同,如果使用对象而不是地址或引用进行向上映射,对象会被“切片”



如程序:

#include <iostream>
using namespace std;

class base
{
	int i;
public:
	base(int I = 0) : i(I){}
	virtual int sum() const {return i;}
};

class derived : public base
{
	int j;
public:
	derived(int I = 0, int J = 0) : base(I), j(J){}
	int sum() const 
	{
		return base::sum() + j;
	}
};

void call(base b)
{
	cout << "sum = " << b.sum() << endl;
}

int main()
{
	base b(10);
	derived d(10, 17);
	call(b);
	call(d);

	system("pause");
	return 1;
}

1. call()接受的只是一个base对象,对call的任何调用都将引起一个与base大小相同的对象压栈并在调用后清除

2. 如果一个base的派生类对象传给call,编译器接受他,但只拷贝这个对象对应于base的部分,切除这个对象的派生类部分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值