在CppCoreGuidelines item C.21,this示例中,显示了在=default
类中声明为AbstractBase
的复制/移动特殊功能。然后继续说
或者,为了防止按照C.67进行切片,可以全部删除复制和移动操作
并提供第二个示例,其中包含用=delete
声明的函数。
如果我有一个打算在继承层次结构中用作基类的类,我是否应该始终使用第二个示例并删除复制/移动特殊功能以防止切片?如果该类会使错误更加严重,为什么还要使用=default
?
答案 0 :(得分:1)
这完全取决于您的用例:
Slicing是使用polymorphic classes时常见的错误原因,尤其是当您的代码大量使用多态基类时。这样很容易意外地复制/移动/分配两个对象值,然后将它们当作基类进行处理。如果这是您的用例,则应遵循建议。通常,此类类最好通过(智能)指针使用,并且为cloned rather than copied。
如果您有一个抽象基类,但是您打算在大多数情况下使用其派生类,则无需以这种方式阻止切片,因为发生错误的风险要小得多。