在CppCoreGuidelines item C.21 , this示例显示了在 AbstractBase
类中声明为 =default
的复制/移动特殊函数。然后它继续说
Alternatively to prevent slicing as per C.67, the copy and move operations can all be deleted
并提供了第二个示例,其中包含使用 =delete
声明的函数。
如果我有一个旨在作为继承层次结构中的基类的类,我是否应该始终使用第二个示例并删除复制/移动特殊功能以防止切片?为什么我要改用 =default
,如果它会导致类出现错误?
最佳答案
这完全取决于您的用例:
Slicing是使用 polymorphic classes 时常见的错误原因,特别是如果您的代码大量使用多态基类。然后很容易意外地复制/移动/分配两个对象值,然后将它们作为基类进行处理。如果这是您的用例,那么您应该遵循建议。通常,这些类最好通过(智能)指针使用,并且是 cloned rather than copied .
如果您有一个抽象基类,但您打算在大多数情况下使用它的派生类,那么就没有必要阻止以这种方式进行切片,因为出错的风险要小得多。
关于c++ - 我什么时候会在基类中默认(而不是删除)复制和移动操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52597074/