我什么时候会默认(而不是删除)基类中的复制和移动操作
When would I default (as opposed to delete) copy and move operations in a base class
在 CppCoreGuidelines 项 C.21 中,此示例显示了在AbstractBase
类中声明=default
的复制/移动特殊函数。然后它继续说
或者,为了防止按照 C.67 进行切片,可以删除所有复制和移动操作
并提供了第二个示例,其中包含使用=delete
声明的函数。
如果我有一个旨在作为继承层次结构中的基类的类,我是否应该始终使用第二个示例并删除复制/移动特殊函数以防止切片?如果它使类出现错误,我为什么要改用=default
?
这完全取决于您的用例:
切片是使用多态类时出错的常见原因,尤其是在代码大量使用多态基类时。然后很容易意外复制/移动/分配两个对象值,然后将它们当作基类进行处理。如果这是您的用例,那么您应该遵循建议。通常,这些类型的类最好通过(智能(指针使用,并且是克隆而不是复制的。
如果你有一个抽象基类,但你打算在大多数情况下使用它的派生类,那么就没有必要以这种方式防止切片,因为出错的风险要小得多。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 基类的填充将被复制到派生类中
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- 如何复制只引用基类的派生类
- 为什么为派生类定义复制构造函数需要定义基类的默认构造函数?
- 为什么基类中的复制和交换会导致派生类中的复制赋值运算符被隐式删除?
- 不可复制基类的聚合初始化
- 有没有办法复制派生类指针的向量而不将其强制转换为基类?
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- 在派生类中使用基类复制 CTOR
- 复制派生类更改基类的构造函数
- 使用 "using" 关键字继承基类的复制和移动构造函数
- 当派生类的基类具有成员指针时,对其进行深层复制
- 试图在具有std ::任何构造函数的基类中调用复制构造函数的问题
- 如何从基类 c++ 复制字段
- 用基类复制构造函数c++并派生类
- 这两种调用基类复制赋值的方法有什么区别
- 为什么隐式复制构造函数调用基类复制构造函数,而定义的复制构造函数不调用?
- 如何从派生类复制构造函数调用基类复制构造函数