什么是对象切片?

有人在IRC中提到它作为切片问题。



蛊毒传说
浏览 760回答 6
6回答

largeQ

“切片”是指将派生类的对象分配给基类实例的位置,从而丢失部分信息 - 其中一些信息被“切片”掉。例如,class A {   int foo;};class B : public A {   int bar;};所以类型的对象B有两个数据成员,foo和bar。然后,如果你写这个:B b;A a = b;然后b关于成员的信息bar丢失了a。

茅侃侃

如果您有基类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都会丢失)。

翻翻过去那场雪

切片问题很严重,因为它可能导致内存损坏,并且很难保证程序不会受到影响。要使用该语言进行设计,支持继承的类应该只能通过引用访问(而不是通过值)。D编程语言具有此属性。考虑A类,从B派生B类。如果A部分有一个指针p,则会发生内存损坏,而B实例将p指向B的附加数据。然后,当附加数据被切掉时,p指向垃圾。
打开App,查看更多内容
随时随地看视频慕课网APP