0

警告:这不是什么是对象切片?,我已经阅读了它并没有澄清我的问题


我的问题是:为什么在对象切片的基类中缺少复制构造函数是一个问题?如果我做类似的事情

Base base;
Derived derived;

Base newbaseobj((Base)derived);

这首先是一个经典的切片问题!我不明白为什么或如何在 Base 中定义用户定义的复制构造函数会有所帮助

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

4

3 回答 3

3

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

这取决于您所说的“缺乏”是什么意思。

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

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

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

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

于 2014-09-25T15:16:13.323 回答
2

回覆

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

一般来说,它不是。

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

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

于 2014-09-25T15:11:05.253 回答
1

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

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

希望我回答了你的问题...

于 2014-09-25T15:10:58.553 回答