缺少复制构造函数如何与对象切片相关?

时间:2014-09-25 14:29:13

标签: c++ object-slicing

警告:What is object slicing?的副本,我已经阅读了它并没有澄清我的问题


我的问题是:为什么缺少复制构造函数是基类中有关对象切片的问题?如果我做了像

这样的事情
Base base;
Derived derived;

Base newbaseobj((Base)derived);

这首先是一个经典的切片问题!我没有看到为什么或如何在Base中定义用户定义的复制构造函数

编辑:我问这个是因为这些答案:https://stackoverflow.com/a/26040064/1938163https://stackoverflow.com/a/26040050/1938163似乎暗示我需要定义/默认复制构造函数来处理对象切片

3 个答案:

答案 0 :(得分:3)

  

我的问题是:为什么缺少复制构造函数是基类中有关对象切片的问题?

这取决于你所说的“缺乏”。

如果真的没有复制构造函数,那么就没有问题:基类无法复制,因此切片不会发生。

如果它没有声明一个可能会有问题;在这种情况下,一个是隐式生成的,可以用来对派生类对象进行切片。

  

我不明白为什么或如何在Base中定义用户定义的复制构造函数

删除它将有助于防止复制,从而完全切片。声明它protected只会允许将基类复制为派生对象的一部分(派生类的成员除外),从而防止大多数切片的情况。

答案 1 :(得分:2)

重新

  

为什么缺少复制构造函数是基类中有关对象切片的问题

一般来说,它不是。

用户定义的复制构造函数可以通过不可访问来帮助防止切片,从而防止复制初始化(完全装甲需要负责复制分配),或者(不要这样做)它可以动态检测切片,对于多态类型,并且在这种情况下允许一般复制。

但是可访问的普通拷贝构造函数不会阻止切片。它最多可以帮助检测调试中的复制操作。

答案 2 :(得分:1)

当你的设计中涉及继承(更具体地说是Polymophism)时,对象切片就会出现。当您通过值将派生类对象传递给期望Base类对象的函数时,会发生切片。无论您是自己定义复制构造函数还是使用编译器生成的切片都将以任何方式进行。

指针是解决切片问题的一种方法,在这种情况下,传递给基础的传递不会产生切片问题(假设涉及多态),并且在涉及指针时不会调用任何类的复制构造函数。

希望我回答你的疑问......