Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 缺少复制构造函数与对象切片有什么关系?_C++_Object Slicing - Fatal编程技术网

C++ 缺少复制构造函数与对象切片有什么关系?

C++ 缺少复制构造函数与对象切片有什么关系?,c++,object-slicing,C++,Object Slicing,警告:这不是的副本,我已经读过了,它没有澄清我的问题 我的问题是:为什么缺少拷贝构造函数是基类中关于对象切片的一个问题?如果我做了类似的事情 Base base; Derived derived; Base newbaseobj((Base)derived); 这首先是一个经典的切片问题!我不认为在Base中定义用户定义的拷贝构造函数有什么帮助 编辑:我问这个问题是因为这些答案:似乎意味着我需要定义/默认一个复制构造函数来处理对象切片当继承(更具体地说是Polymophism)涉及到您的设

警告:这不是的副本,我已经读过了,它没有澄清我的问题


我的问题是:为什么缺少拷贝构造函数是基类中关于对象切片的一个问题?如果我做了类似的事情

Base base;
Derived derived;

Base newbaseobj((Base)derived);
这首先是一个经典的切片问题!我不认为在Base中定义用户定义的拷贝构造函数有什么帮助


编辑:我问这个问题是因为这些答案:似乎意味着我需要定义/默认一个复制构造函数来处理对象切片

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

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


希望我能回答您的问题……

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

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

希望我能回答你的问题…

re

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

一般来说,情况并非如此

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

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

re

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

一般来说,情况并非如此

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

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

我的问题是:为什么缺少拷贝构造函数是基类中关于对象切片的一个问题

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

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

如果它只是不声明一个,那么可能会有问题;在这种情况下,一个是隐式生成的,可用于切片派生类对象

我看不出在Base中定义用户定义的复制构造函数有什么帮助

删除它将有助于防止复制,从而完全避免切片。声明它受保护将有助于只允许基类作为派生对象的一部分进行复制(派生类的成员内除外),从而防止大多数情况下的切片

我的问题是:为什么缺少拷贝构造函数是基类中关于对象切片的一个问题

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

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

如果它只是不声明一个,那么可能会有问题;在这种情况下,一个是隐式生成的,可用于切片派生类对象

我看不出在Base中定义用户定义的复制构造函数有什么帮助


删除它将有助于防止复制,从而完全避免切片。声明它
受保护
只允许将基类作为派生对象的一部分进行复制(派生类成员内除外),这将有助于防止大多数情况下的切片。

我不确定这个问题是否真的是重复的,但如果切片是实际问题,那么链接的问题应该会有所帮助。关于析构函数/复制构造函数/赋值运算符:这被称为“三个规则”,它不是关于切片,而是关于资源(主要是指针)处理。这不是重复的,这肯定不能回答我的问题!你的意思是禁用/删除复制构造函数等吗?@user3834459 3/5规则和对象切片是一种正交的东西。很抱歉,我不清楚你到底在问什么。最后一个链接是我写的一个描述三法则的答案,它与切片没有什么关系。作为一种事后考虑,我建议“您可以考虑删除复制/移动操作以防止切片”;但是我当然没有说(希望没有暗示)任何类似“定义/默认一个副本构造函数来处理对象切片”的内容。我不确定这个问题是否是重复的,但是如果切片是实际问题,那么链接的问题应该会有所帮助。关于析构函数/复制构造函数/赋值运算符:这称为“三个规则”,不是abo