有人在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。
茅侃侃
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都会丢失)。
翻翻过去那场雪
TA贡献2065条经验 获得超14个赞
切片问题很严重,因为它可能导致内存损坏,并且很难保证程序不会受到影响。要使用该语言进行设计,支持继承的类应该只能通过引用访问(而不是通过值)。D编程语言具有此属性。
考虑A类,从B派生B类。如果A部分有一个指针p,则会发生内存损坏,而B实例将p指向B的附加数据。然后,当附加数据被切掉时,p指向垃圾。
- 6 回答
- 0 关注
- 798 浏览
添加回答
举报
0/150
提交
取消