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