切片在C ++中意味着什么?

时间:2010-03-12 12:33:14

标签: c++ oop inheritance visual-studio-2008

在C ++ FAQ网站中提到 - “当通过值作为基类对象传递时,较大的派生类对象被切片”,切片是什么意思?要展示的样品吗?

http://www.parashift.com/c++-faq-lite/value-vs-ref-semantics.html#faq-31.8

我使用的是VSTS 2008 +本机C ++作为我的开发环境。

4 个答案:

答案 0 :(得分:13)

引用this lecture

  

切片

     

假设D类派生自   我们可以将D视为C类   一些额外的数据和方法。在   在数据条款中,D具有所有数据   C有,也可能更多。就......而言   方法,D无法隐藏任何方法   C,可能还有其他方法。在   C的现有方法的术语,   D唯一能做的就是   用自己的版本覆盖它们。

     

如果x是D类的对象,那么我们   可以相对于C切片x   扔掉所有的扩展   这使得x成为D,而只保留了   C部分。切片的结果是   总是C类的对象。

     

slicing http://webdocs.cs.ualberta.ca/~hoover/Courses/201/201-New-Notes/lectures/slides/slice/slide1.gif

     

设计原则:切片对象   关于父类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.
}