在C ++ FAQ网站中提到 - “当通过值作为基类对象传递时,较大的派生类对象被切片”,切片是什么意思?要展示的样品吗?
http://www.parashift.com/c++-faq-lite/value-vs-ref-semantics.html#faq-31.8
我使用的是VSTS 2008 +本机C ++作为我的开发环境。
答案 0 :(得分:13)
引用this lecture:
切片
假设D类派生自 我们可以将D视为C类 一些额外的数据和方法。在 在数据条款中,D具有所有数据 C有,也可能更多。就......而言 方法,D无法隐藏任何方法 C,可能还有其他方法。在 C的现有方法的术语, D唯一能做的就是 用自己的版本覆盖它们。
如果x是D类的对象,那么我们 可以相对于C切片x 扔掉所有的扩展 这使得x成为D,而只保留了 C部分。切片的结果是 总是C类的对象。
设计原则:切片对象 关于父类C 仍然应该生产出良好的形式 C类的对象。
使用警告:即使D是-a C, 你必须要小心。如果你有 参数类型是C和你 提供一个D如果你将被切片 正在按值,指针或者进行调用 参考。请参阅下面的示例。
关于虚拟功能的说明。其 签名用于识别哪个 一个要执行。
注意切片=运算符, 它可以使lhs不一致。 此外,operator =永远不是虚拟的, 这没有意义。例如, 假设A,B类都是 C类的子类只是因为一个 A是C,B是C,不是 意味着您可以将B对象分配给A 宾语。没有运行时类型 您无法保证安全的信息 分配
答案 1 :(得分:4)
切片意味着派生的类信息丢失。基类参数强制创建基类的对象,该对象与派生类共享相同的基类状态。 E.g:
struct B { int x; };
struct D : B { double y; };
void f(B b) {}
int main() {
D d;
f(d);
}
在功能f
中,您将无法访问D::y
。
编辑:感谢大家的编辑。请确保编辑增加了价值。注意
structs
,默认继承为public
。 答案 2 :(得分:1)
struct A {
};
struct B : public A {
int x;
};
void f( A a ) {
// in here you can't access any of B's members - they have ben sliced
}
int main() {
B b;
f( b ); // slice!
}
答案 3 :(得分:1)
切片基本上是删除派生类对象的派生,就好像它是一个基类对象一样。
例如:
class A
{
public:
int x;
};
class B : public A
{
public:
int y;
};
void test(A a)
{
}
int main()
{
B b;
test(b); // here the object b will be visible as A object in method test
//none of the B's data or methods are available.
}