为了账号安全,请及时绑定邮箱和手机立即绑定

什么是对象切片?

什么是对象切片?

蛊毒传说 2019-05-20 16:57:04
有人在IRC中提到它作为切片问题。
查看完整描述

6 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

“切片”是指将派生类的对象分配给基类实例的位置,从而丢失部分信息 - 其中一些信息被“切片”掉。


例如,


class A {

   int foo;

};


class B : public A {

   int bar;

};

所以类型的对象B有两个数据成员,foo和bar。


然后,如果你写这个:


B b;


A a = b;

然后b关于成员的信息bar丢失了a。


查看完整回答
反对 回复 2019-05-20
?
茅侃侃

TA贡献1842条经验 获得超21个赞

如果您有基类A和派生类B,则可以执行以下操作。


void wantAnA(A myA)

{

   // work with myA

}


B derived;

// work with the object "derived"

wantAnA(derived);

现在该方法wantAnA需要一份副本derived。但是,该对象derived无法完全复制,因为该类B可能会发明不在其基类中的其他成员变量A。


因此,要调用wantAnA,编译器将“切掉”派生类的所有其他成员。结果可能是您不想创建的对象,因为


它可能不完整,

它的行为就像一个对象A(该类的所有特殊行为B都会丢失)。


查看完整回答
反对 回复 2019-05-20
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

切片问题很严重,因为它可能导致内存损坏,并且很难保证程序不会受到影响。要使用该语言进行设计,支持继承的类应该只能通过引用访问(而不是通过值)。D编程语言具有此属性。

考虑A类,从B派生B类。如果A部分有一个指针p,则会发生内存损坏,而B实例将p指向B的附加数据。然后,当附加数据被切掉时,p指向垃圾。


查看完整回答
反对 回复 2019-05-20
  • 6 回答
  • 0 关注
  • 754 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信