C++ 中的五法则、继承和多态性之间有什么关系?[复制]

What is the relationship between the Rule of Five, Inheritence, and Polymorphism in C++? [duplicate]

提问人:3DMage 提问时间:12/13/2022 更新时间:12/13/2022 访问量:110

问:

我一直在学习析构函数、复制构造函数、移动构造函数等。我还学习了关于在基类中将析构函数标记为虚拟的建议,该基类具有从它继承的派生类。

根据五法则,如果我在类中定义析构函数,我还应该定义复制构造函数和赋值运算符,以及类中的移动构造函数和赋值运算符。

我关于五法则的问题与继承和多态性有关。如果我创建一个基类,该基类具有从它继承的派生类,那么五法则是否仅适用于基类,还是也适用于派生类?

C++ 继承 多态性 五法则

评论

0赞 n. m. could be an AI 12/13/2022
在大多数多态层次结构中,应禁用复制和移动 ()。这条规则有合法的例外,所以不要盲目地遵循它。但是,当您禁用复制/移动时,仅在基类中执行此操作就足够了。= delete

答:

1赞 HolyBlackCat 12/13/2022 #1

基类的作用(它自定义的特殊成员)不会影响派生类的 3/5/0 规则。如果派生类不需要为自己自定义特殊成员,则应使用零规则。

请注意,仅添加虚拟析构函数确实算作出于 3/5/0 规则的目的对其进行自定义,这意味着您必须遵循该类的 3/5 规则。

但原因并不明显:声明任何析构函数(无论是否)都会剥夺您的移动操作,只留下复制操作。这会静默地将您班级的所有动作替换为副本,这并不好。(这不会影响派生类,这些类仍会移动,但其中的基类子对象除外。=default

=defaulting 移动操作以将它们带回,然后删除复制操作,这些操作也需要 ed。=default

上述内容仅对具有数据成员的类(从移动中受益)有影响,但还有另一个问题:在声明析构函数时,复制操作仍然存在,因此它们应该像移动操作一样消失。

这意味着,如果您有虚拟析构函数,即使您没有数据成员,也必须执行复制和移动操作,以避免弃用警告(生成时使用以启用它们)。=default-Wdeprecated